CCDataVisitor(数据访问器 子类:CCPrettyPrinter _indentLevel-用于数组; string _indentStr; _result-指针字符串)

本文介绍了一个用于Cocos2d-x框架的数据访问者模式实现,该模式能够帮助执行依赖于多态对象类型的操作,如数据序列化、漂亮打印对象及安全地从集合中读取值。

#ifndef __CCDATAVISITOR_H__

#define __CCDATAVISITOR_H__

#include "platform/CCPlatformMacros.h"

#include <string>

NS_CC_BEGIN

class CCObject;

class CCBool;

class CCInteger;

class CCFloat;

class CCDouble;

class CCString;

class CCArray;

class CCDictionary;

class CCSet;

/**

 * Visitor(访问者) that helps to perform(执行) action that depends on(取决于,依赖于) polymorphic(多态的) object type

 *

 * Use cases://使用情况

 *  - data serialization(序列化;串行化;连载长篇),

 *  - pretty(漂亮的) printing(印刷) of \a CCObject *   //打印一个object的指针

 *  - safe value reading from \a CCArray, \a CCDictionary, \a CCSet //从数组中安全的读取值

 *

 * Usage://用法

 *  1. subclass(子集) CCDataVisitor

 *  2. overload visit() methods for object that you need to handle(重载visit)

 *  3. handle(操作) other objects in \a visitObject()() //在visitObject()中操作其它object

 *  4. pass your visitor to \a CCObject::acceptVisitor() //把visitor传递给CCObject::acceptVisitor()

 */

class CC_DLL CCDataVisitor

{

public:

    virtual ~CCDataVisitor() {}

    /** default method, called from non-overloaded(非 超载的) methods and for unrecognized(未识别的) objects */

    virtual void visitObject(const CCObject *p) = 0;

    virtual void visit(const CCBool *p);

void CCDataVisitor::visit(const CCBool *value)

{

    visitObject(value);

}


    virtual void visit(const CCInteger *p);

    virtual void visit(const CCFloat *p);

    virtual void visit(const CCDouble *p);

    virtual void visit(const CCString *p);

    virtual void visit(const CCArray *p);

    virtual void visit(const CCDictionary *p);

    virtual void visit(const CCSet *p);

};

class CC_DLL CCPrettyPrinter : public CCDataVisitor

{

public:

    CCPrettyPrinter(int indentLevel = 0);

CCPrettyPrinter::CCPrettyPrinter(int indentLevel/* = 0 */)

{

    setIndentLevel(indentLevel);

}

    

    virtual void clear();

void CCPrettyPrinter::clear()

{

    _result.clear();

}


    virtual std::string getResult();

std::string CCPrettyPrinter::getResult()

{

    return _result;

}

    

    virtual void visitObject(const CCObject *p);

void CCPrettyPrinter::visitObject(const CCObject *p)

{

    char buf[50] = {0};

    sprintf(buf, "%p", p);

    _result += buf;

}



    virtual void visit(const CCBool * p);

    virtual void visit(const CCInteger *p);

    virtual void visit(const CCFloat *p);

void CCPrettyPrinter::visit(const CCFloat *p)

{

    char buf[50] = {0};

    sprintf(buf, "%f", p->getValue());

    _result += buf;

}


    virtual void visit(const CCDouble *p);

void CCPrettyPrinter::visit(const CCDouble *p)

{

    char buf[50] = {0};

    sprintf(buf, "%lf", p->getValue());

    _result += buf;

}


    virtual void visit(const CCString *p);

void CCPrettyPrinter::visit(const CCString *p)

{

    _result += p->getCString();

}


    virtual void visit(const CCArray *p);

void CCPrettyPrinter::visit(const CCArray *p)

{

    _result += "\n";

    _result += _indentStr;

    _result += "<array>\n";


    setIndentLevel(_indentLevel+1);

    CCObject* obj;

    int i = 0;

    char buf[50] = {0};

    CCARRAY_FOREACH(p, obj)

    {

        if (i > 0) {

            _result += "\n";

        }

        sprintf(buf, "%s%02d: ", _indentStr.c_str(), i);

        _result += buf;

        CCPrettyPrinter v(_indentLevel);

        obj->acceptVisitor(v);

        _result += v.getResult();

        i++;

    }

    setIndentLevel(_indentLevel-1);

    

    _result += "\n";

    _result += _indentStr;

    _result += "</array>";

}


    virtual void visit(const CCDictionary *p);

    virtual void visit(const CCSet *p);

private:

    void setIndentLevel(int indentLevel);

void CCPrettyPrinter::setIndentLevel(int indentLevel)

{

    _indentLevel = indentLevel;

    _indentStr.clear();

    for (int i = 0; i < _indentLevel; ++i) {

        _indentStr += "\t";

    }

}

    int _indentLevel;

    std::string _indentStr;

    std::string _result;

};


NS_CC_END

#endif


/data/k50048780/cpp_mutator/mutators/BitStream.cpp: In member function ‘BitStream BitStream::slice(size_t, size_t) const’: /data/k50048780/cpp_mutator/mutators/BitStream.cpp:154:46: error: passing ‘const BitStream’ as ‘this’ argument discards qualifiers [-fpermissive] 154 | copy_bits(*this, start_bit, 0, bit_length); | ^ In file included from /data/k50048780/cpp_mutator/mutators/BitStream.cpp:5: /data/k50048780/cpp_mutator/mutators/BitStream.h:62:10: note: in call to ‘void BitStream::copy_bits(const BitStream&, size_t, size_t, size_t)’ 62 | void copy_bits(const BitStream& src, size_t src_start, size_t dest_start, size_t bit_count); | ^~~~~~~~~ CMakeFiles/mutator.dir/build.make:446: recipe for target 'CMakeFiles/mutator.dir/mutators/BitStream.cpp.o' failed make[3]: *** [CMakeFiles/mutator.dir/mutators/BitStream.cpp.o] Error 1 make[3]: *** Waiting for unfinished jobs.... /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp: In constructor ‘StringLengthEdgeCase::StringLengthEdgeCase(std::shared_ptr<StringBase>, std::mt19937): /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:10:37: error: no matching function for call to ‘IntegerEdgeCases::IntegerEdgeCases(std::shared_ptr<StringBase>&, std::mt19937&)’ 10 | : IntegerEdgeCases(obj, rand) { | ^ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.h:10, from /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:5: /data/k50048780/cpp_mutator/mutators/string/../utils.h:146:5: note: candidate: ‘IntegerEdgeCases::IntegerEdgeCases(std::shared_ptr<NumberBase>, std::mt19937&)’ 146 | IntegerEdgeCases(std::shared_ptr<NumberBase> obj, std::mt19937 &rand); | ^~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/../utils.h:146:50: note: no known conversion for argument 1 from ‘shared_ptr<StringBase>’ to ‘shared_ptr<NumberBase>’ 146 | IntegerEdgeCases(std::shared_ptr<NumberBase> obj, std::mt19937 &rand); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /data/k50048780/cpp_mutator/mutators/string/../utils.h:144:7: note: candidate: ‘IntegerEdgeCases::IntegerEdgeCases(const IntegerEdgeCases&)’ 144 | class IntegerEdgeCases : public Mutator { | ^~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/../utils.h:144:7: note: candidate expects 1 argument, 2 provided /data/k50048780/cpp_mutator/mutators/string/../utils.h:144:7: note: candidate: ‘IntegerEdgeCases::IntegerEdgeCases(IntegerEdgeCases&&)’ /data/k50048780/cpp_mutator/mutators/string/../utils.h:144:7: note: candidate expects 1 argument, 2 provided /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp: In member function ‘virtual std::pair<long int, long int> StringLengthEdgeCase::get_limits(std::shared_ptr<StringBase>): /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:24:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 24 | if (obj->max_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:25:47: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 25 | max_ = std::min(max_, obj->max_length.value()); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:29:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 29 | if (obj->min_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:30:47: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 30 | min_ = std::max(min_, obj->min_length.value()); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp: At global scope: /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:42:6: error: no declaration matches ‘void StringLengthEdgeCase::perform_mutation(std::shared_ptr<StringBase>, int64_t)’ 42 | void StringLengthEdgeCase::perform_mutation(std::shared_ptr<StringBase> obj, int64_t value) { | ^~~~~~~~~~~~~~~~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.cpp:5: /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.h:16:10: note: candidate is: ‘void StringLengthEdgeCase::perform_mutation(std::shared_ptr<String>, size_t)’ 16 | void perform_mutation(std::shared_ptr<String> obj, size_t index); | ^~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthEdgeCase.h:13:7: note: ‘class StringLengthEdgeCase’ defined here 13 | class StringLengthEdgeCase : public IntegerEdgeCases { | ^~~~~~~~~~~~~~~~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/MutatorFactory.cpp:8: /data/k50048780/cpp_mutator/mutators/number/NumberVariance.h:13:32: error: invalid covariant return type for ‘virtual std::pair<long unsigned int, long unsigned int> NumberVariance::get_limits(std::shared_ptr<NumberBase>)’ 13 | std::pair<size_t ,size_t > get_limits(std::shared_ptr<NumberBase> obj); | ^~~~~~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/../../utils/sample_util.h:12, from /data/k50048780/cpp_mutator/mutators/string/StringCaseLower.h:8, from /data/k50048780/cpp_mutator/mutators/MutatorFactory.cpp:6: /data/k50048780/cpp_mutator/mutators/string/../../utils/../mutators/utils.h:70:51: note: overridden function is ‘virtual std::pair<long int, long int> IntegerVariance::get_limits(std::shared_ptr<NumberBase>)’ 70 | virtual std::pair<std::int64_t, std::int64_t> get_limits(std::shared_ptr<NumberBase> obj); | ^~~~~~~~~~
最新发布
06-28
# 基础面类型类(抽象层) class Face: def __init__(self, face_type: str, geometry, parameters: dict): """ :param face_type: 面类型标识('hole', 'slot'等) :param geometry: 几何数据(坐标系/顶点等) :param parameters: 特征参数(直径/长度等) """ self.type = face_type self.geometry = geometry self.params = parameters def get_type(self) -> str: return self.type # 特定面类型子类(扩展层) class HoleFace(Face): def __init__(self, geometry, diameter, depth): super().__init__("hole", geometry, { "diameter": diameter, "depth": depth }) class SlotFace(Face): def __init__(self, geometry, length, width): super().__init__("slot", geometry, { "length": length, "width": width }) # 面管理类(核心逻辑) class FaceManager: def __init__(self): self._faces = [] def add_face(self, face: Face): self._faces.append(face) def get_all_faces(self) -> list[Face]: return self._faces.copy() def get_faces_by_type(self, face_type: str) -> list[Face]: return [f for f in self._faces if f.get_type() == face_type] @property def holes(self) -> list[HoleFace]: return [f for f in self._faces if isinstance(f, HoleFace)] @property def slots(self) -> list[SlotFace]: return [f for self._faces if isinstance(f, SlotFace)] # 面工厂类(可选,增强扩展性) class FaceFactory: @staticmethod def create_hole(geometry, diameter, depth): return HoleFace(geometry, diameter, depth) @staticmethod def create_slot(geometry, length, width): return SlotFace(geometry, length, width) 按照这套思路帮我改成c++代码
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值