2016-10-13 14 views
2

私はJavaから来て、C++を学んでいます。私は、テストファイルによって提供されるこのように呼び出すことができるプログラム、(ブーツ)を実装したい: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(...)を提供するオブジェクトを構築し、コンストラクタであること、それが正しいのですか?私の実装(下記参照)では、 "コンストラクタを直接呼び出すことはできません"のようなもの(英語ではない)を表示するエラーが発生するためです。私は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);  
}; 

私が知っている唯一の他の事はthisにsimilatされる戻り値で、anagram::anagram(...)は静的メソッドである可能性があることですが、それは私には意味がありません。誰かがこれを説明できるのであれば、それはいいだろう:)

+1

'auto subject = anagram :: anagram(" diaper ");'は有効なコンストラクタ呼び出しではありません。 –

+0

名前空間内のファクトリ関数である可能性があります。 –

+2

Typo;コンストラクターは 'ClassName(stuff)'や 'ClassName {stuff}'のように "呼び出されます"。 'CalssName :: ClassName(stuff) – NathanOliver

答えて

1

一つの方法は、クラスanagramがsimilaryという名前の名前空間に配置されている場合です。

#include <string> 
namespace anagram 
{ 
class anagram 
{ 
    public: 
    anagram(std::string s) {} 
}; 
} 

int main() 
{ 
    auto subject = anagram::anagram("diaper"); 
} 

http://ideone.com/1OVhIz

+0

これは 'anagram'のコンストラクタを他の静的メソッドと呼ぶことができると仮定しているため、これは無関係です。 – Asu

+1

このようなことを行うことは理にかなっていますか? – suffi

+0

これはあなたが言ったものと同じ構文を提供しているだけですが、無用に冗長です。名前空間がなければ、anagram :: anagram( "thing")ではなくanagram( "thing") 'を実行することになります。もっと良いとは思いません。特に、 'auto thing = anagram :: anagram(" foo ");は、' 'anagram :: anagram thing {" foo "};' – Asu

2

は、Javaから来ているので、あなたがこのように似何かを参照するために使用されている:Cで

someobject T = new someObject(argument); 

++別にクラスを作成しますway:

someObject T(argument); 

あなたは、名前がTのオブジェクトをC++で作成しました。もう1つの方法はオブジェクトへのポインタを作成することです:

someObject *T = new someObject(argument); 

これはjavaと似ていますが、手動でそのポインタを削除する必要があります。ヒープではなく、スタック上にオブジェクトを作成する方が常に良いです。メモリリークを回避します。


質問に答えるには間違っています。先ほどお会いしたようにコンストラクターを呼びます。静的メンバー関数を呼び出す方法については正しいですが、静的でも仮想的でもないため、Ctorには適用されません。それはあなたが示されている構文で作業することができます

+1

スタックを使用できる状況でヒープを使用する*場合によっては利点があります。私は一度、大量の配列をスタックに割り当てて、 'std :: vector'(内部的にヒープを使用する)よりもパフォーマンスが悪かった状況を経験しました。キャッシュの可能性が高いしかし、一般的なケースでは、私はもっと同意できませんでした。 – Asu

+0

実際には静的関数ですか?しかし、「マッチ」はまだクラスのアングラムの対象です。 – suffi

+0

はい、しかし、「マッチ」のタイプを指定する価値があるので、コードをより明確にすることができます。イテレータ、タプルなどを処理するときのように長い名前があるときに便利です。 – Asu

1

構文は、実際のJavaと同様の方法を見てしまう(除きます

auto subject = Anagram("diaper"); 

しかし、もっと簡単な方法があります:

、)もちろん newため
Anagram subject("diaper"); 
Anagram subject{"diaper"}; // C++11 and newer 

Anagramは、デフォルトコンストラクタを持っている場合は、それを定義するとき、それが構築されることに注意してください - あなたは*ポインタを使用していない限り、それは、nullやJavaのようなものにすることはできません。ISNを使用すると、動的割り当てを使用する場合は、newを使用することができ

auto matches = Anagram{"diaper"}.matches({"hello", "world", "zombies","pants"}); 

を、そこ:また、あなたはsubject変数を定義する必要はありませんので、一時的なAnagramオブジェクトを構築することができる

Anagram subject; 

あなたがもう必要ないときに値を削除するGCはありません...!

Anagram* subject = new Anagram("diaper"); 
// ... do some stuff with subject... 
delete subject; // Destroy the dynamically allocated subject and deallocate it 

あなたが動的なメモリ割り当てを使用したい場合は、私はあなたがこのcpprefrence pageに見つけることができますスマートポインタを使用するためにあなたをお勧めします。手動メモリ割り当てよりも多くの利点があります。

2

コールanagram::anagramanagramを働かなければならない場合、関数が呼び出されるanagramその中に名前空間は、あなたがメソッドmatches呼び出すことができ、その上にオブジェクトを返すように定義されている:

namespace anagram { 
    SomeType anagram(string n) { return SomeType(n); } 
}; 

もクラス名可能性がありanagram名前空間の内部anagram

ctorsが識別子としてクラスの名前を使用できること以外は、メソッドがないため静的メソッドではありません。

+0

+1これはそれですが、@revolver_ocelotは少し速かったと思いますが、私は彼が最初に言っていたことを理解できませんでしたが、ありがとう! :) – suffi

+0

ようこそ! –

関連する問題