使用指针访问cpp中的私有值

时间:2014-02-21 23:48:42

标签: c++ accessor

由于某种原因,getter方法不起作用。它们是公开的,所以我不知道出了什么问题。

for (std::vector<Document>:: const_iterator it = v.begin(); it != v.end(); ++it)
{
    cout << it->getName() << endl;
    counter += it->getLength();
}
  

错误:将'const Document'作为'void Document :: getName()'的'this'参数传递,丢弃限定符[-fpermissive]                    cout&lt;&lt; it-&gt; getName()&lt;&lt; ENDL;

     

错误:'operator&lt;&lt;'不匹配(操作数类型是'std :: ostream {aka std :: basic_ostream}'和'void')                    cout&lt;&lt; it-&gt; getName()&lt;&lt; ENDL;

     

错误:将'const Document'作为'void Document :: getLength()'的'this'参数传递,丢弃限定符[-fpermissive]                    counter + = it-&gt; getLength();

     

错误:类型'int'和'void'的操作数无效,二进制'operator +'                    counter + = it-&gt; getLength();

嗯,有没有办法可以为最后一个问题做(int) (it->getLength())

我们可以为另一个做:

std::ostringstream value;   
value << (*it).getName();
cout << getName << endl;     

2 个答案:

答案 0 :(得分:2)

只需声明getter为const

class Document
{
public:
    std::string getName() const;
    int getLenght() const;
};

并指定其返回值。

错误消息的可读性不高,但在 gcc

error: passing A as B argument of C discards qualifiers 

几乎总是由尝试修改const的内容引起的。

其他消息是明确的:

  

错误:'operator&lt;&lt;'不匹配
  (操作数类型是' std :: ostream {aka std :: basic_ostream}'和' void ')   cout&lt;&lt; it-&gt; getName()&lt;&lt; ENDL;

您正试图将 std :: ostream void 传递给运营商。

答案 1 :(得分:1)

虽然您没有显示相关代码,但错误消息足以让您对此问题有一个很好的猜测。

你的班级显然看起来像这样:

class Document { 
// ...
public:
    void getName() { /* ... */ }   
    void getLength() { /* ... */ }
    // ...
};

要解决此问题,您需要将getNamegetLength更改为1)返回值,并且2)成为const成员函数,这是一般订单:

class Document { 
// ...
public:
    std::string getName() const { /* ... */ }   
    size_t getLength() const { /* ... */ }
    // ...
};