2017-07-05 3 views
-1

がうまくいけば、私のタイトルがあまりにも混乱はありません。私はSFMLを使って私のゲームのサウンドマネージャーを書こうとしています。私は新しい/削除を "スマートポインタ" std :: shared_ptrに置き換えようとしています。これは私がこれまで持っていたものです。はSTDに)(構造体を一backすることはできません::ベクトル<はstd :: shared_ptrの<theStruct>> theVector

/* SoundManager.h */ 
#ifndef SOUNDMANAGER_H 
#define SOUNDMANAGER_H 

#include <SFML/Audio.hpp> 
#include <string> 
#include <memory> 

class SoundManager 
{ 
    public: 
     ~SoundManager(); 

     struct jteSound 
     { 
      sf::Sound snd; 
      sf::SoundBuffer sndBuffer; 
      std::string name; 
     }; 

     //Load a new sound from path and store it in audio bank bnk. 
     //Banks are simply std::vectors of type jteSound. 
     void registerNewSound(std::vector<std::shared_ptr<jteSound>> &bnk, std::string path, std::string sndName); 

     //Footsteps bank 
     std::vector<std::shared_ptr<jteSound>> bnkFootsteps; 
}; 

#endif // SOUNDMANAGER_H 

/* SoundManager.cpp */ 
#include "SoundManager.h" 
#include <stdlib.h> 

SoundManager::~SoundManager() 
{ 
    /* 
    //Cleanup each sound bank that we use. 
    for (std::vector<jteSound*>::iterator it = bnkFootsteps.begin(); it != bnkFootsteps.end(); ++it) { 
     delete *it; 
    } 
    */ 
} 

void SoundManager::registerNewSound(std::vector<std::shared_ptr<jteSound>> &bnk, std::string path, std::string sndName) 
{ 
    static int counter = 0; 
    for (int i = counter; counter <i+1; counter++) { 
     bnk.push_back(jteSound); 
     bnk[i]->name = sndName; 
     bnk[i]->sndBuffer.loadFromFile(path); 
     bnk[i]->snd.setBuffer(bnk[i]->sndBuffer); 
    } 
} 

bnk.push_back(jteSound);コンパイラエラーが発生します。行を削除すると、プログラムはコンパイルされますが、クラッシュします。私はemplace_back()またはjteSound*またはnew jteSoundのようなものを試してみましたが、何も働きません。私はいつも長いコンパイラエラーや即座のランタイムクラッシュを取得します。私は定期的にポインタを使用して、新しい/ https://bpaste.net/show/fa684f2f2d5ehttps://bpaste.net/show/c74ac701ce7aを参照して、削除すると予想されるように、コードが動作します。どんな考えがありがとう!

答えて

1

std::vector内の要素のタイプはstd::shared_ptr<jteSound>です。つまり、std::vector::push_backはそのタイプのインスタンスのみを受け入れます。

次の2つのオプションを持っているあなたのコードを動作させるために。次のようにstd::vector::emplaceを使用している第二

bnk.push_back(std::make_shared<jteSound>()); 

// the equivalent counterpart is: 
bnk.push_back(std::shared_ptr<jteSound>(new jteSound)); 

:次のように最初はstd::make_sharedヘルパー機能を使用している

bnk.emplace(bnk.end(), new jteSound); 
以下コメント

2番目のオプションを使用して、警告危険であるとなぜならnew jteSoundは成功したがstd::vector::emplaceがメモリを再割り当てする必要がありますし、失敗したときには、メモリリークを引き起こす可能性があります。

+1

ありがとうございました! std :: make_sharedがトリックを行いました。解決済み。 – JohnBobSmith

+0

ようこそ。 – Akira

+0

専門とインスタンスは異なるものです。 – Deduplicator

関連する問題