Proper Class Modeling using C++ and const

Proper Class Modeling using C++ and const

本文关键字:and const C++ using Class Modeling Proper      更新时间:2023-10-16

让我倾向于我主要用C#开发,而我所做的C++开发并没有完全利用C++语言。我现在正试图按预期使用这种语言,并且在通过的论点中用const声明来表达我的不满。在过去,我从未使用过它们,也从未通过破解的方式使它们与STL一起工作。

我的理解是,当我想在函数中使用o作为只读函数时,我会创建以下函数:

void foo(const MyClass* o);

所以这是我的问题。。。代码优先:

#include <iostream>
#include <string>
using namespace std;
///////////////////////////////////////////////////////////
// Classes are defined in the one file for an easy post.
///////////////////////////////////////////////////////////
class ClassA {
private: // member variables
string m_name;
public: // constructors
ClassA(const string& name = "") : m_name{name} {}
virtual ~ClassA() { }
public: // accessors
const string& name() const { return m_name; }
void setName(const string& value) { m_name = value; }   
};
class ClassB {
private: // member variables
string m_name;
ClassA m_child;
public: // constructors
ClassB(const string& name = "") : m_name{name} {}
virtual ~ClassB() { }
public: // accessors
const string& name() const { return m_name; }
void setName(const string& value) { m_name = value; }
ClassA* child() { return &m_child; }
void setChild(const ClassA* value) { m_child = *value; }
};
///////////////////////////////////////////////////////////
// Protoptypes are not used to save space for the post.
void doSomethingA(const ClassA* o) {
cout << "name = " << o->name() << endl << endl;
}
void doSomethingB(const ClassB* o) {
cout << "name = " << o->name() << endl << endl;
doSomethingA(o->child());
}
///////////////////////////////////////////////////////////
int main(int argc, char** argv) {
ClassA a { "My Class A" };
ClassB b { "My Class B" };

b.setChild(&a);
b.child()->setName("My New Name");
doSomethingB(&b);
return 0;
}

在main()中,编译器(g++版本4.7.2)在doSomethingB:中失败

doSomethingA(o->child());

带错误:将"const ClassB"作为"ClassA*ClassB::child()"的"this"参数传递会丢弃限定符[-fpermission]

现在我将类作为指针传递给函数。我计划总是使用指针,因为我对引用/指针选项有问题。我选择了一个指针,并坚持下去。所以doSomethingA和doSometingB我希望这是一个常量,告诉程序员他们的类没有被更改。但我只想要child()的一个版本,有时我想将其用作"只读",有时则允许用户更改子对象中的数据(我承认这不是最好的方法,但在某些用例中我需要这样做)。我甚至尝试过:

doSomethingA(const_cast<const ClassA*>(o->child()));

但这并没有奏效。

过去,我删除了函数中的const声明来实现类似的功能,但现在我想使用适当的c++。请帮忙。

尝试

ClassA* child() const { return &m_child; }

const ClassA* child() const { return &m_child; }

以保持常量正确性

此外,只要不打算传递nullptr,就不需要使用指针。因此,您可以执行以下操作:

void doSomethingB(const ClassB& o);
// in class ClassB
const ClassA& child() const { return m_child; }
ClassA& child() { return m_child; }

引用仍然像指针一样包含多态性。

您正试图针对常量对象访问一个非常量函数。您需要使函数const:

const ClassA* child() const { return &m_child; }

您还可以提供常量和非常量版本:

ClassA* child() { return &m_child; }
const ClassA* child() const { return &m_child; }

这样,当您有一个非常量对象时,就可以在ClassA上调用非常量方法。