const限定符的问题是获取对象的私有属性

时间:2010-10-23 23:22:12

标签: c++ constructor const copy-constructor

我是一个全新的C ++,我有一个非常愚蠢的问题。

我有一个Graph类,我需要为它创建一个复制构造函数。这是我的班级:

#include <igraph.h>
#include <iostream>
using namespace std;


class Graph { 
public:
  Graph(int N); // contructor
  ~Graph();     // destructor
  Graph(const Graph& other); // Copy constructor 
  igraph_t * getGraph();
  int getSize();

private:
  igraph_t graph;
  int size;
};

int igraph_copy(igraph_t * to, const igraph_t * from)中有一个功能igraph.h可以充分复制igraph_t类型。

构造函数和析构函数很简单并且正常工作,我有以下复制构造函数:

Graph :: Graph(const Graph& other) {
  igraph_t * otherGraph = other.getGraph();
  igraph_copy(&graph, otherGraph);
  size = other.getSize();

}

igraph_t * Graph :: getGraph(){ 
  return &graph;
}

int Graph :: getSize() {
  return size;
}

当我编译它时,我得到以下错误:

calsaverini@Ankhesenamun:~/authC/teste$ make
g++ -I/usr/include/igraph -L/usr/local/lib -ligraph -c foo.cpp -o foo.o
foo.cpp: In copy constructor ‘Graph::Graph(const Graph&)’:
foo.cpp:30: error: passing ‘const Graph’ as ‘this’ argument of ‘igraph_t* Graph::getGraph()’ discards qualifiers
foo.cpp:32: error: passing ‘const Graph’ as ‘this’ argument of ‘int Graph::getSize()’ discards qualifiers
make: *** [foo.o] Error 1

我觉得这必须是非常基本的东西,我没有得到const限定符的含义。

我真的不懂C ++(我真的不太了解C,就此而言......)但是我需要搞砸那些做过的人所做的代码。 :(

关于这个拷贝构造函数的任何线索或评论也将非常谦虚地赞赏。 :P

1 个答案:

答案 0 :(得分:5)

getGraph函数需要使用const限定符声明:

const igraph_t* getGraph() const { ... }

这是因为other是一个常量引用。当对象或引用是常量时,您只能调用使用const限定符声明的该对象的成员函数。 (在函数名称和参数列表后出现的 const。)

请注意,这也要求您返回一个常量指针。

在C ++中,编写两个“get”函数是常见的,一个是常量而另一个是非常量,以便处理这两种情况。所以你可以声明两个getGraph()函数:

const igraph_t* getGraph() const { ... }

...和

igraph_t* getGraph() { ... }

如果对象是常量,则调用第一个,如果对象是非常量,则调用第二个。您可能应该阅读有关const member-function qualifier以及const-correctness的更多信息。