簡體   English   中英

用C ++構造對象

[英]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");
}

http://ideone.com/1OVhIz

該語法實際上看起來與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM