Как я могу назначить переменную экземпляра, не вызывая ее конструктор в C ++? - PullRequest
2 голосов
/ 20 июля 2011

По сути, у меня есть класс с именем VisaMux и класс с именем MuxPath. MuxPath имеет закрытую переменную экземпляра VisaMux. Я хочу, чтобы конструктор MuxPath назначил переменной экземпляра данный объект VisaMux без вызова пустого конструктора VisaMux ().

5  MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux){
6      clk_sel = Clk_sel;
7      lane_sel = Lane_sel;
8      mux = Mux;
9  }

Этот код приводит к ошибке:

MuxPath.cpp:5: error: no matching function for call to ‘VisaMux::VisaMux()’
VisaMux.h:20: candidates are: VisaMux::VisaMux(const std::string&, const uint&, const uint&, const std::vector<VisaLane, std::allocator<VisaLane> >&, const std::vector<VisaResource, std::allocator<VisaResource> >&)

Как видите, в первой строке (5-я строка) появляются ошибки, поэтому кажется, что const VisaMux & Mux каким-то образом вызывает VisaMux (), которого не существует. Это также происходит, если я просто использую VisaMux Mux.

Я не хочу, чтобы он вызывал пустой конструктор для VisaMux, потому что я хочу, чтобы VisaMux создавалась только путем передачи его конструктору всех необходимых параметров.

Как я могу это сделать?

Ответы [ 5 ]

6 голосов
/ 20 июля 2011

Использовать список инициализации конструктора:

MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
       : clk_sel(Clk_sel)
       , lane_sel(Lane_sel)
       , mux(Mux)
{}
5 голосов
/ 20 июля 2011

Используйте member-initialization-list в конструкторе как:

MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux) 
   :clk_sel (Clk_sel),lane_sel(Lane_sel),mux(Mux)
{ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ it's called initialization-list

}

На самом деле, в вашем коде все переменные-члены используют присваивание , а не соответствующий им конструктор , что означает, что mux пытается создать с default конструктор, даже до того, как он входит в конструктор MuxPath. А поскольку VisaMux не имеет конструктора по умолчанию, это приводит к ошибке компиляции.

Таким образом, используя список инициализации, в котором синтаксис mux(Mux) вызывает конструктор копирования VisaMux, вы избегаете вызова конструктора по умолчанию VisaMux, который не существует. А так как mux уже создан с помощью копирования, нет необходимости использовать присваивание в теле конструктора.

0 голосов
/ 20 июля 2011

Вы задаетесь вопросом, как вы можете получить красные стены в вашем доме без предварительной установки стенных шпилек. Если ваш класс MuxPath содержит переменную Mux, то в какой-то момент его создания потребуется создать экземпляр переменной типа Mux. Это подразумевает, что будет создан экземпляр типа Mux, и единственный механизм, который это сделает, - это вызов конструктора.

Это может быть конструктор по умолчанию или конструктор без аргументов, конструктор копирования или конструктор, который принимает какой-либо другой аргумент. Другие ответы показывают, как это сделать в списке инициализации члена. Но нет никакого способа обойти тот факт, что в какой-то момент потребуется вызвать некоторый конструктор для Mux.

0 голосов
/ 20 июля 2011
class MuxPath {
  MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
    : clk_sel(Clk_sel), lane_sel(Lane_sel), mux(Mux) {};
  ...
};
0 голосов
/ 20 июля 2011
   MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux)
       : mux(Mux)
   {
       clk_sel = Clk_sel;
       lane_sel = Lane_sel;
   }

Это называется "список инициализации".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...