изменение количества аргументов конструктора класса C ++ - PullRequest
0 голосов
/ 15 марта 2012

Я скорее парень на C, но сейчас я работаю над проектом C ++.Вот почему я немного запутался:

у нас есть такое наследование:
Node-> MultiNode-> RoundAbout

Теперь немного кода (для простоты я пропустил почти всекроме конструкторов):

class MultiNode : public sim_mob::Node {
public:
    MultiNode(int x, int y) : Node(x, y) {}
...
}

и

class Roundabout : public sim_mob::MultiNode {
public:
    Roundabout() : MultiNode() {}
}

Как видите, конструктор Roundabout () вызывает конструктор MultiNode () без аргументов, в то время как MultiNode имеет только один конструктор с 2args:

MultiNode (int x, int y)

Возможен ли такой сценарий?что такое расширение, пожалуйста?

Этот код хорошо компилируется в своем первоначальном месте, но когда я скопировал папку в область тестирования, чтобы начать редактирование, я получаю эту ошибку (что для меня разумно): ошибка: нет подходящей функции для вызова 'sim_mob :: MultiNode :: MultiNode ()

Нет другого аналогичного файла или класса, который может запутаться.

ошибка для вашей справки:

~/workspace/parser5/geospatial$ make
Scanning dependencies of target driver
[ 33%] Building CXX object CMakeFiles/driver.dir/geo5-pskel.cxx.o
In file included from /home/vahid/workspace/parser5/geospatial/geo5-pskel.hxx:134:0,
                 from /home/vahid/workspace/parser5/geospatial/geo5-pskel.cxx:39:
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp: In constructor ‘sim_mob::Roundabout::Roundabout()’:
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: **error: no matching function for call to ‘sim_mob::MultiNode::MultiNode()’**
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: note: candidates are:
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note: sim_mob::MultiNode::MultiNode(int, int)
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note:   candidate expects 2 arguments, 0 provided
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note: sim_mob::MultiNode::MultiNode(const sim_mob::MultiNode&)
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note:   candidate expects 1 argument, 0 provided
make[2]: *** [CMakeFiles/driver.dir/geo5-pskel.cxx.o] Error 1
make[1]: *** [CMakeFiles/driver.dir/all] Error 2
make: *** [all] Error 2

спасибо

Ответы [ 5 ]

1 голос
/ 15 марта 2012

Вы уверены, что ваш процесс сборки не изменяет код каким-либо образом перед его компиляцией? Есть ли какой-нибудь макрос препроцессора, который создает конструктор по умолчанию (yuck), который не запускается, потому что некоторые настройки проекта не определены?

Подобные вещи - единственное, о чем я могу думать, что может привести к компиляции кода.

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

1 голос
/ 15 марта 2012

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

Вы сказали, что "этот код хорошо компилируется в своем первоначальном месте, но когда я скопировал папку в область тестирования, чтобы начать редактирование, я получил эту ошибку". Это заставляет меня задуматься, что это за «оригинальное место», и почему вы должны были скопировать его где-нибудь, чтобы отредактировать. Используете ли вы систему контроля версий или это больше похоже на единственную копию кода в общей папке, которую все взламывают? Если это последнее, у вас нет способа убедиться, что общая копия обновлена ​​и соответствует всем изменениям; возможно MultiNode имеет конструктор по умолчанию в этой копии кода.

1 голос
/ 15 марта 2012

Эта ошибка, как и ожидалось.

Вы можете построить объект только с помощью существующего конструктора.В некоторых ситуациях конструктор по умолчанию (конструктор с нулевым аргументом) будет неявно генерироваться как default, но это не применяется в этом случае, поскольку у вас уже есть определяемый пользователем конструктор.

1 голос
/ 15 марта 2012

Или вы можете передать значения по умолчанию для X, Y от кольцевой

class Roundabout : public sim_mob::MultiNode {
public:
    Roundabout() : MultiNode(0, 0) {}
    Roundabout(int x, int y) : MultiNode(x, y) {}
}
1 голос
/ 15 марта 2012

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

т.е.

 class MultiNode : public sim_mob::Node {
 public:
      MultiNode(int x, int y) : Node(x, y) {}
       ...
      MultiNode(){
      //....
      }
 };

или

 class MultiNode : public sim_mob::Node {
 public:
      MultiNode(int x = def_x, int y = def_y) : Node(x, y) {}
       ...
      MultiNode(){
      //....
      }
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...