2014-02-27 54 views
-1

在C++中動態分配帶有重載構造函數的對象的語法是什麼?在C++中動態分配帶重載構造函數的對象

如果我有一類Foo:

class Foo{ 
public: 
    Foo(string str, int nbr); // Overloaded constructor 
}; 

和(使用美孚)第二類foo2的:

#include "Foo" 
class Foo2{ 
public: 
    Foo* myFoo; // Wrong! 
    Foo2(){ 
     myFoo = new Foo(myStr, myNbr); 
    } 
}; 

顯示的錯誤是:

no matching function for call to "Foo::Foo()"

如何我可以在創建myFoo對象指針時指定它將使用構造函數Foo(string str, int nbr)而不是Foo()構造函數。

是否有可能不使用構造函數委託?

+3

你得到了什麼錯誤? – WeaselFox

+0

這不是錯誤的語法。語法是正確的。也許這是類定義結尾缺少的分號?另外構造函數是私有的,它應該是公開的可調用的。 – dornhege

+0

鑑於這個錯誤,你確定你正在編譯你認爲自己的代碼嗎?如果是,您確定錯誤位於標有「錯誤語法」的行上。 – user2079303

回答

2

構建對象的語法是正確的。

很難說肯定,因爲你沒有告訴錯誤,但我的猜測是,你的問題是,構造函數是private。這意味着你不能在類之外使用構造函數。

有關錯誤信息編輯:

以下是編譯一個完整的例子。我添加了一些會產生錯誤的示例行:沒有匹配函數調用'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 
} 

由於錯誤,你的代碼試圖使用默認的構造函數地方

編輯2有關您的新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

正確的方法是初始化每個構造函數中的成員。您可以在私有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) 
{ 
    ... 
} 
+0

歡迎來到SO。由於存在很多問題,因此認爲: a。以最直接的方式回答問題。 b。不要偏離問題的主題。 你的答案雖然適用於諸如「我怎樣才能避免多個計算機中的代碼重複」這樣的問題,否則也不會這樣做。請重新說明。 – Fox

1

語法無誤。 有許多可能性,因爲你沒有寫完整的類定義。 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 
}; 
+0

我沒有定義默認的構造函數。它是強制性的嗎? – feronjb

+0

是的,如果你在上面寫的是強制性的,否則像我之前提到的通過傳遞參數來調用構造函數。 – Singh

+0

由於'Foo * myFoo;'正在調用默認構造函數「沒有匹配函數調用」Foo :: Foo()「 – Singh