2017-04-17 10 views
-6

これを行う正しい構文は何ですか?確かに私はいくつかの愚かな間違いをした...残念ながら、私はベクトルをよりよく理解しようとしています。私は不要なポインタを作成したことを知っていますが、構文を理解する必要があります。コンパイル時に私が取得オブジェクトの関数への戻りベクトル

#include <iostream> 
#include <vector> 

class otherClass 
{ 
    public: 
     otherClass(int x):value(x) 
     { 
      //ctor 
     } 
     int getValue() 
     { 
      return value; 
     } 
    private: 
     int value; 
}; 

class MyClass 
{ 
    public: 
     MyClass(int x) 
     { 
      obj = new std::vector<otherClass>(x,otherClass{5}); 
     } 
     otherClass getVector() 
     { 
      return obj; //HERE FIRST ERROR <--------------- 
     } 
    private: 
     std::vector<otherClass>*obj; 
}; 

void doSomething(otherClass*obj) 
{ 
    std::cout << obj->getValue() << std::endl; 
} 

int main() 
{ 
    MyClass*aClass = new MyClass(10); 
    doSomething(aClass->getVector()); //HERE SECOND ERROR <--------------- 
    return 0; 
} 

エラー:まず

:セカンド

error: invalid conversion from 'std::vector<otherClass>*' to 'int' [-fpermissive] 

error: cannot convert 'otherClass' to 'otherClass*' for argument '1' to 'void doSomething(otherClass*)' 
+0

'getVector'は' otherClass'ではなくベクトルを返すように聞こえます。 – aschepler

+0

あなたは何をしようとしているのか明確ではありません。あなたは関数からベクトルを返そうとしていますか? – pm100

+0

このプログラムは 'std :: cout << 5 << std :: endl;' – myaut

答えて

1

まず、ここでは任意のポインタを使用しても意味がありません。なし!

第2に、getterはconstと修飾され、ベクターなどの重いオブジェクトのconst参照を返す必要があります。それは無駄なコピーを防ぐ。

int getValue() const 
//    ^^^^^ 
{ 
    return value; 
} 
otherClass

、そして次にメインで

class MyClass 
{ 
public: 
    MyClass(int x) : obj(x, otherClass{5}) // construction here 
    { } 
    std::vector<otherClass> const & getVector() const 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^ 
    { 
     return obj; 
    } 
private: 
    std::vector<otherClass> obj; // no pointer, just a vector 
}; 

は:

MyClass aClass(10); 

何がdoSomething()でやりたいことは不明です。あなたのコードdoSomething(aClass->getVector())で返されたベクトルotherClassを処理するはずです。だからそれはする必要があります:

void doSomething(std::vector<otherClass> const & obj) 

私はあなたのコードを書くことができます。

+0

しかし私のプログラムでは、 "obj"はポインタです。なぜなら、私はそれを "delete"で破壊する必要があるからです。 "aClass"は同じ理由のためのポインタです... – nostyn

+1

@nostynそうすべきではありません。その理由はありません。 –

+0

私はそれをポインタを使ってやりたければできませんでしたか?どうして?私は関数にobjアドレスを渡すことはできませんし、不必要に多くのメモリを割り当てることを避ける? – nostyn

0

はちょうどあなたが

std::vector<otherClass> *getVector() 
{ 
    return obj; 
} 
を返すようにしたいものを言います

または

std::vector<otherClass> getVector() 
{ 
    return *obj; 
} 
+1

また、第2のケースではconst参照を返さないことを悲しい。 –

+0

私はちょうど少し動くOPを取得しようとしている、明らかに提供されたコードで多くの多くのものが間違っています – pm100

+0

間違った方向のビット... –

関連する問題