![](/img/trans.png)
[英]C++: Passing reference of constructing object to constructed member objects?
[英]Constructing objects in c++
所以,我來自Java,正在學習c ++。 我想實現一個可以由測試文件(引導)提供的,可以這樣調用的程序:
auto subject = anagram::anagram("diaper");
auto matches = subject.matches({"hello", "world", "zombies","pants"});
vector<string> expected;
BOOST_REQUIRE_EQUAL_COLLECTIONS(expected.begin(), expected.end(), matches.begin(), matches.end());
我正確嗎,那anagram::anagram(...)
是一個構造函數,構造了一個提供方法matches(...)
的Object? 因為在我的實現中(請參見下文),我遇到一個錯誤,說“不能直接調用構造函數”之類的東西(不是英語)。 我認為對於c ++中的構造函數我有些不了解。
// this is part of my implementation of anagram.h
class anagram{
public:
anagram(const string a);
vector<string> matches(vector<string> &list);
private:
string a;
bool isAnagram(string s);
};
我唯一知道的另一件事是anagram::anagram(...)
可以是靜態方法,其返回值與this
相似,但是對我而言這沒有意義。 因此,如果有人可以解釋這個問題,那就太好了:)
因為您來自Java,所以習慣於看到類似以下內容:
someobject T = new someObject(argument);
在C ++中,您以不同的方式構造類:
someObject T(argument);
和tada,您在c ++中創建了一個名稱為T的對象。 另一種方法是創建指向對象的指針:
someObject *T = new someObject(argument);
它更類似於java,但是現在您必須手動刪除該指針。 最好在堆棧而不是堆上創建對象。 它避免了內存泄漏。
回答您的問題:您錯了。 您稱呼我之前向您展示的構造函數。 您對如何調用靜態成員函數是正確的,但這不適用於Ctor,因為它永遠不能是靜態或虛擬的。
如果調用anagram::anagram
必須正常工作anagram
是其中的一個命名空間,則定義了一個稱為anagram
的函數,以返回一個對象,您可以在該對象上調用matches
方法:
namespace anagram {
SomeType anagram(string n) { return SomeType(n); }
};
這也可能是一個類名anagram
在命名空間里anagram
。
那不可能是靜態方法,因為除了ctor可以使用類的名稱作為標識符之外,沒有方法可以使用。
它可以與您顯示的語法一起使用的一種方法是,將類anagram
放置在類似命名空間中:
#include <string>
namespace anagram
{
class anagram
{
public:
anagram(std::string s) {}
};
}
int main()
{
auto subject = anagram::anagram("diaper");
}
該語法實際上看起來與Java中的語法類似(當然,除了new
之外):
auto subject = Anagram("diaper");
但是有一種更簡單的方法:
Anagram subject("diaper");
Anagram subject{"diaper"}; // C++11 and newer
還要注意,如果Anagram
具有默認構造函數,則在定義它時將對其進行構造-不能為null
或類似Java的構造函數,除非您使用*
指針。
Anagram subject;
您還可以構建一個臨時Anagram
對象,因此不需要定義subject
變量:
auto matches = Anagram{"diaper"}.matches({"hello", "world", "zombies","pants"});
如果要使用動態分配,則可以使用new
,但是當您不再需要該值時,沒有任何GC可以刪除該值...!
Anagram* subject = new Anagram("diaper");
// ... do some stuff with subject...
delete subject; // Destroy the dynamically allocated subject and deallocate it
如果您想使用動態內存分配,我建議您使用可以在此cpprefrence頁上找到的智能指針。 與手動分配內存相比,它們具有許多優點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.