Проблема с квалификаторами const для получения приватных атрибутов объекта - PullRequest
1 голос
/ 24 октября 2010

Я совершенно новичок в 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;
};

В igraph.h есть функция int igraph_copy(igraph_t * to, const igraph_t * from), которая адекватно копирует тип 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, если на то пошло ...), но мне нужно возиться с кодом, созданным людьми, которые знают. (

Любые подсказки или замечания об этом конструкторе копирования также будут очень смиренно оценены. : Р

1 Ответ

5 голосов
/ 24 октября 2010

Функция getGraph должна быть объявлена ​​с квалификатором const:

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

Это потому, что other является постоянной ссылкой.Когда объект или ссылка постоянны, вы можете вызывать только функции-члены этого объекта, которые объявлены с квалификатором const.(const, который появляется после имени функции и списка параметров.)

Обратите внимание, что для этого также требуется возвращать постоянный указатель.

Это распространено в C ++написать две функции «get», одна из которых постоянная, а другая непостоянная, чтобы иметь дело с обоими случаями.Таким образом, вы можете объявить две функции getGraph ():

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

... и

igraph_t* getGraph() { ... }

Первая будет вызвана, еслиобъект является постоянным, и второй будет вызван, если объект не является постоянным.Возможно, вам следует прочитать больше о квалификаторе функции-члена const , а также о const-correctness в целом.

...