Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用const_铸入工厂模型_C++_Qt_Factory_Const Cast - Fatal编程技术网

C++ 使用const_铸入工厂模型

C++ 使用const_铸入工厂模型,c++,qt,factory,const-cast,C++,Qt,Factory,Const Cast,如果我的命名法不正确,请原谅/纠正我 我从来都不懂const\u cast的用法。一般来说,在我看来,如果您必须使用const\u cast,那么您的类/方法可能存在根本性的缺陷。然而,我可能偶然发现了一个恰当使用它的案例。我有一个很大的类,其中有几个成员是在构造期间分配的,并且在对象的使用寿命内保持不变 因为这些对象经常被破坏和构造,所以我想尝试一下我认为被称为工厂模型的东西:与其创建/破坏对象,不如将其检索/返回到未分配对象的缓存中。例如(当然是简化的): class个人工厂{ 公众: co

如果我的命名法不正确,请原谅/纠正我

我从来都不懂const\u cast的用法。一般来说,在我看来,如果您必须使用
const\u cast
,那么您的类/方法可能存在根本性的缺陷。然而,我可能偶然发现了一个恰当使用它的案例。我有一个很大的类,其中有几个成员是在构造期间分配的,并且在对象的使用寿命内保持不变

因为这些对象经常被破坏和构造,所以我想尝试一下我认为被称为工厂模型的东西:与其创建/破坏对象,不如将其检索/返回到未分配对象的缓存中。例如(当然是简化的):

class个人工厂{
公众:
const Person*getPerson(const QString和newname){
//我无法分配新名称,因为它是常量
if(m_personCache.isEmpty())
返回createNewPerson();
其他的
返回m_personCache.pop();
}
void returnPerson(Person*Person){m_personCache.push(Person);Person=0;}
静态PersonFactory*实例;
私人:
Person*createNewPerson()常量{返回新的Person(“”;}
QStack m_personCache;
}
班主任{
公众:
friend Person*PersonFactory::createNewPerson();
常量QString&name()常量{
返回m_名称;
}
无效销毁(){
人员工厂::返回人员(本);
}
私人:
人名(QString name):m_name(name){}
//m_name是const,应该保持这种方式以防止意外更改
const QString mu name;
}
我无法分配新名称,因为它是
const
。这是一个很好的例子,还是我错过了一个明显的选择?使用
const\u cast
是否会导致性能下降

使用const_cast是否会导致性能下降


也许吧。当对象实际上是
const
时,舍弃
const
来存储值会产生未定义的行为。未定义的行为可能表现为性能受损。

mutable
不是设计缺陷的标志。例如,它的存在使对象可以缓存值,而不是在每次需要时重新计算值。我删除了对
mutable
的引用,因为它对问题没有任何帮助。当然,在使用C++的时候,不要只使用java设计模式,而是只考虑C++小对象分配器,比如洛基库中的一个。例如,对于Java方法,您不能使用
std::unique_ptr
std::shared_ptr
的默认值。因此,它会对正确性和工作量产生负面影响“丢弃
const
来存储一个值,而对象实际上是
const
会产生未定义的行为。”你能澄清一下你所说的未定义行为是什么意思吗?我的意思是,语言定义不会对实现的功能施加任何要求。许多初学者遇到的一个简单例子是:
intmain(){constinti=3;constcast(i)=4;std::无法理解。因此,使用实现的工厂模式否定了
m_name
保持
常量字符串的选项。我想我可以将其设置为非
常量
,将
PersonFactory
设置为
朋友类
,然后直接分配它。这是正确的OOP技术吗?无所谓。似乎是清楚地回答这个问题。
const\u cast
的这个用例似乎根本错误。谢谢!
class PersonFactory {
public:
    const Person* getPerson(const QString& newname) {
    //I can't assign the new name because it's const
        if(m_personCache.isEmpty())
            return createNewPerson();
        else
            return m_personCache.pop();
    }
    void returnPerson(Person* person) { m_personCache.push(person); person = 0; }
    static PersonFactory* instance;
private:
    Person* createNewPerson() const { return new Person(""); }
    QStack<Person*> m_personCache;
}

class Person {
public:
    friend Person* PersonFactory::createNewPerson();

    const QString& name() const {
        return m_name;
    }

    void destroy() {
        PersonFactory::returnPerson(this);
    }
private:
    Person(QString name) : m_name(name) {}
    //m_name is const and should remain that way to prevent accidental changes
    const QString m_name;
}