2017-01-21 32 views
0

私はC++をかなり新しくしましたが、他のプログラムで使用するために自分のライブラリを構築したいという要望に達しました。私はネームスペースと構造体を使って解決できる組織の問題にぶつかってきましたが、クラス内で自分の関数を整理したいと思います。私は検索しましたが、多くの明確な答えは見つかりませんでした。私は、すでに多くの関数を書いていて、もっと書くようにしているので、 "friend class x"を使わなくてもいいと思います。同じオブジェクトに置いておけば、すべての参照を避けることができます。C++のクラスでネストされた組織を作成するにはどうすればよいですか?

class FileOps 
private: 
<data to be manipulated> 
public: 
    // Target Management: 
    void setDir(std::string input); 
    void setFile(std::string target, std::string extension); 
    // File Management: 
    void listFiles(std::string manualExtension); 
    void setFileList(); 
    bool fileSeek(); 
    void deleteFile(); 
    std::string chooseFile(std::string manualExtension); 
    // File Content: 
    void displayFileContents(); 
    std::string randomLine(); 
    void listManagement(); 
    // Database Management: 
    void typeList(); 
    void smartBuffer(); 
    void dataBuffer(std::string dataType); 
    searchTable searchQuery; 
    std::string searchSimple(std::string searchType); 
    void searchDump(); 
    void globalDataSearch(); 
    void globalTermSearch(); 
    void globalDataDump(); 
    void dataDump(std::string dataTypeSelection); 

私は簡単に、その後の引数によって構造体を渡し、構造体の中にプライベートデータを回すことによって、この問題を解決することができますが、私はクラスごとに1つのオブジェクトを作成したいのですが、その後、implimentationで、コマンドを参照します以下のようなもの:など

Fileops x; 
x.TargetManage::setDir("thisdirectory"); 
x.FileManage::listFiles(); 

...

これは可能ですか?もしそうなら、どうですか?

+1

なぜこのようなクラスが欲しいですか?自立型関数の集合を含む名前空間は、この問題のはるかに自然な解決策です。とにかくあなたがここに提案するクラスには** far **のメンバー関数がたくさん含まれています!プライベートデータを独自のクラスにカプセル化し、そのクラスのインスタンスへの参照を自立した関数に渡す必要があります。 –

+0

さて、値の代わりに(定数)参照でパラメータを取る方が良いかもしれません: 'const std :: string&parameterName'。これにより、不要な複製が防止され、複製が意図されていることを示す値でパラメータを取ることができます(元のコピーに変更を加えずに、元のコピーに影響を与えることなく)。 –

+0

@JustinTime:これはC++ 11以前のアドバイスです。 C++ 11以来、移動は多くのコピーを避けることができます。 – MSalters

答えて

0
#include <iostream> 
class FileOps 
public: 
FileOps() {TargetManage.f = this;} 
private: 
friend class s1; 
int x = 1; 
public: 
    class s1 { 
    public: 
     FileOps * f; 
     void setDir(std::string input) {std::cout << ++f->x;} 
     void setFile(std::string target, std::string extension); 
    } TargetManage; 
    class { 
    public: 
     void listFiles(std::string manualExtension); 
     void setFileList(); 
    } FileManage; 
... 

Fileops x; 
x.TargetManage.setDir("thisdirectory"); 
x.FileManage.listFiles(); 
+0

これは私の最初の推測でしたが、うまくいきません。これがjavaの場合、C++のネストされたクラスは親クラスからメンバーを継承しません。ご返信ありがとうございます。 –

+0

あなたは完全に正しいです。 FileOpsのデータメンバーを(最初の)ネストされたクラスが利用できるようにするための答えを更新しました。しかし、あなたはこのアプローチが複雑すぎるかもしれません。 –

関連する問題