2010-10-12 98 views
1

我遇到了C++类的这个问题。我想获得指向myBar对象的对象,并将其存储在quxBar中。原因是我希望能够使用quxBar->getX()来检查价值,但我也想避免意外地从Qux中调用它,所以我尝试使用Bar const*C++指向const类成员问题的指针

class Bar 
{ 
private: 
    int x; 
public: 
    void setX(int X) { x = X; }; 
    int getX(){ return x }; 
} 

class Foo 
{ 
private: 
    Bar *myBar; 
public: 
    Bar const* getPointerToBar(){ return myBar; };    
} 

class Qux 
{ 
    void myMethod(); 
    Bar const* quxBar; 
    Foo *mainFoo;  
} 

void Qux::myMethod() 
{ 
    quxBar = mainFoo->getPointerToBar(); 
    std::cout << quxBar->getX(); 
    quxBar->setX(100); // HERE!!! 
    std::cout << quxBar->getX(); // returns 100 
} 

可惜的是它不工作,因为我仍然能够与没有编译错误执行quxBar->setX(100)

也许我的方法是完全错误的,但使用当前的“技能”:)我不知道如何解决它。

在此先感谢您的任何帮助和建议。

+0

你能至少发布实际编译的代码吗?当我修复了所有显而易见的编译错误(不正确的分号等)时,我得到了以下几个错误:'将const Bar'作为'int'的Bar参数'getX()'丢弃限定符' 。 – 2010-10-12 11:06:58

+0

我认为你的编译器有问题。你使用什么编译器? – Goz 2010-10-12 11:34:33

+0

你根本没有得到一个错误或只是在那一行?你需要在你的类定义的最后一个分号。 – CashCow 2010-10-12 12:28:52

回答

7

我不认为这是你的实际代码,首先是由于它的语法错误,其次是由于它实际上是正确的(大部分)。更具体地说,使用这段代码,quxBar->setX(100);会导致编译错误。

int getX() const { return x; } 

也许:

然而,quxBar->getX()也将是一个编译错误,你需要告诉可以在const对象调用编译器,可以通过在函数签名的末尾添加const做到这一点在你的实际代码你有Bar* const quxBar而不是Bar const* quxBar;它们是指两种不同的东西:前者是常量指针来Bar,而后者是指向const指令杆。例如。在前面的例子中,只有指针本身不能被修改,但它指向的对象可以。

+0

+1为正确的方式。 – sje397 2010-10-12 11:16:03

+0

谢谢,实际上“Bar * const quxBar”而不是'Bar const * quxBar'“没有任何问题。原始代码中使用的QList指针存在一些问题。 – Moomin 2010-10-12 12:08:51