Каков синтаксис для динамического выделения объекта с перегруженным конструктором в C ++?
Если у меня есть класс Foo:
class Foo{
public:
Foo(string str, int nbr); // Overloaded constructor
};
И второй класс Foo2 (используя Foo):
#include "Foo"class Foo2{
public:
Foo* myFoo; // Wrong!
Foo2(){
myFoo = new Foo(myStr, myNbr);
}
};
Ошибка отображается следующим образом:
нет соответствующей функции для вызова «Foo :: Foo ()»
Как я могу при создании указателя на объект myFoo указать, что он будет использовать Foo(string str, int nbr)
конструктор, а не Foo()
конструктор.
Возможно ли это без использования конструктора делегирования?
Ваш синтаксис для построения объекта правильный.
Трудно сказать наверняка, так как вы не сообщили об ошибке, но я думаю, что ваша проблема в том, что конструктор частный. Это означает, что вы не можете использовать конструктор вне класса.
Изменить относительно сообщения об ошибке:
Вот полный пример, который компилируется. Я добавил несколько примеров строк, которые приводят к ошибке: нет соответствующей функции для вызова ‘Foo :: Foo ()’.
#include <string>
class Foo{
public:
Foo(std::string str, int nbr);
};
// empty definition
Foo::Foo(std::string str, int nbr) {}
// delegating constructor (c++11 feature)
// this would produce error: no matching function for call to 'Foo::Foo()'
//Foo::Foo(std::string str, int nbr) : Foo::Foo() {}
int main() {
Foo* myFoo;
myFoo = new Foo("testString", -1); // this is correct
// trying to construct with default constructor
//Foo myFoo2; // this would produce error: no matching function for call to 'Foo::Foo()'
//Foo* myFoo3 = new Foo(); // so would this
}
Учитывая ошибку, ваш код пытается использовать конструктор по умолчанию где-то.
Edit2 относительно вашего нового Foo2
пример. Ваше объявление Foo * и вызов конструктора все еще верны, и код должен скомпилироваться, если вы исправите видимость метода и пропущенные точки с запятой. Следующий пример компилируется:
#include <string>
class Foo{
public:
Foo(std::string str, int nbr); // Overloaded constructor
};
Foo::Foo(std::string str, int nbr){}
class Foo2{
Foo* myFoo; // This is still correct
public:
Foo2() {
myFoo = new Foo("", 1);
}
};
int main() {
Foo2 foo2;
}
Синтаксис правильный.
Есть много возможностей, так как вы не написали полное определение класса.
1. проверьте, записан ли cnstsructor по умолчанию.
2. Проверьте, находятся ли оба конструктора внутри публичного раздела.
3. В качестве альтернативы вы можете изменить вызов конструктора, как показано ниже,
Foo* myFoo = new Foo("testString", -1);
Следующий код должен работать.
class Foo
{
string str;
int num;
public:
Foo(string p_str, int nbr):str(p_str),num(nbr){}; // Overloaded constructor
Foo() {}; // Default constructor
};
Правильный способ — инициализация членов в каждом конструкторе. Вы можете извлечь их общий код в приватную функцию-член init () и вызывать его в каждом конструкторе, как показано ниже:
class Foo {
public:
Foo(string x);
Foo(string x, int y);
...
private:
void init(string x, int y);
};
Foo::Foo(string x)
{
init(x, int(x) + 3);
...
}
Foo::Foo(string x, int y)
{
init(x, y);
...
}
void Foo::init(string x, int y)
{
...
}