-1

私はgvimを使用してクラスのc ++を実行しています(Linuxで実行する必要があると言われ、クラスはc ++を使用して教えられているため)。私は以前に Java のクラスを受講したことがありますが、この先生は、C++ だけを使用する別のクラスであると述べているため、C++ や Linux で物事を行う方法を実際には教えてくれませんでした。

宿題で抱えている問題は、いくつかのクラスを作成して互いに情報を取得する必要があることですが、コンパイルしようとすると常にエラーが発生します。(私はそれらを互いに通信させ、関数/変数を互いに使用させる方法を理解できないようです。)

元:

class a {

string user;
public: string user2;
public: vector<string> friendList;

public: void userName()
{
    cout output
    cin >> user;
}
public: void addFriend()
{
    cout output
    cin >> user2;
    friendList.push_back(user2);
}

public: string getName()
{
    return user;
}
};

(この 2 番目のクラス 2 の方法を試しましたが、どちらも機能しません) way1--->

class b {
string message, username;
a User;
public: void postMessage()
    {
        cout ____
        getline(cin, message);

        username = User.getName();
    }
};

またはこの方法---->

class b: public a {
string message, username;
a User;
public: void postMessage()
    {
        cout ____
        getline(cin, message);

        username = User.getName();
    }
};

(または、このような機能がありました:)

    public: void postMessage()
    {
        cout ____
        getline(cin, message);

        username = user2;
    }
};

クラスはどちらの方法でも互いに話し合っていないようです.これらの方法は機能しないため、どうやってそれらを取得するのかわかりません.

私の質問は、b が a の関数または変数を使用できるように、a を b と通信させるにはどうすればよいかということだと思います。クラスが互いに通信できるように、また各クラスを呼び出すメイン関数を取得できるように知る必要があります(各クラスは別の.cppファイルにあります)。

編集:

(クラスは別のファイルにあります)

エラー用のターミナル用のスクリプトを作成しました。

Script started on Sun 29 Sep 2013 02:27:42 PM CDT
]0;darksithis002@darkmist002-VirtualBox: ~/lab1darksithis002@darkmist002-VirtualBox:~/lab1$ g++ -c  homepg.cpp
homepg.cpp:14:26: error: expected class-name before ‘,’ token
homepg.cpp:15:1: error: expected class-name before ‘{’ token
homepg.cpp:18:24: error: ‘user’ was not declared in this scope
homepg.cpp:18:24: error: ISO C++ forbids initialization of member ‘userName1’ [-fpermissive]
homepg.cpp:18:24: error: making ‘userName1’ static [-fpermissive]
homepg.cpp:18:24: error: invalid in-class initialization of static data member of non-integral type ‘std::string {aka std::basic_string<char>}’
homepg.cpp:19:19: error: ISO C++ forbids initialization of member ‘counter’ [-fpermissive]
homepg.cpp:19:19: error: making ‘counter’ static [-fpermissive]
homepg.cpp:19:19: error: ISO C++ forbids in-class initialization of non-const static member ‘counter’
homepg.cpp:20:30: error: ‘friendList’ was not declared in this scope
homepg.cpp:20:30: error: ISO C++ forbids initialization of member ‘friends’ [-fpermissive]
homepg.cpp:20:30: error: making ‘friends’ static [-fpermissive]
homepg.cpp:20:30: error: invalid in-class initialization of static data member of non-integral type ‘std::vector<std::basic_string<char> >’
homepg.cpp:22:5: error: ‘cout’ does not name a type
homepg.cpp:23:5: error: ‘cout’ does not name a type
homepg.cpp:24:5: error: ‘cout’ does not name a type
homepg.cpp:29:26: error: ISO C++ forbids declaration of ‘displayHome’ with no type [-fpermissive]
homepg.cpp: In member function ‘int homepg::displayHome()’:
homepg.cpp:31:12: error: ‘messageBuff’ was not declared in this scope
homepg.cpp:45:6: error: ‘nextbrac’ was not declared in this scope
homepg.cpp:53:18: error: ‘userName’ was not declared in this scope
homepg.cpp:64:28: error: ‘friends’ was not declared in this scope
homepg.cpp:85:6: error: ‘count’ was not declared in this scope
]0;darksithis002@darkmist002-VirtualBox: ~/lab1darksithis002@darkmist002-VirtualBox:~/lab1$ g++ -c    messageBuffer.cpp
 messageBuffer.cpp: In member function ‘void messageBuffer::postMessage()’:
 messageBuffer.cpp:26:13: error: ‘user’ was not declared in this scope
 messageBuffer.cpp: In member function ‘void messageBuffer::tweetMessage()’:
 messageBuffer.cpp:45:17: error: ‘user’ was not declared in this scope
]0;darksithis002@darkmist002-VirtualBox: ~/lab1darksithis002@darkmist002-VirtualBox:~/lab1$ exit
 exit

 Script done on Sun 29 Sep 2013 02:29:16 PM CDT

テストとして、私は2つのクラスをまとめました。1つはそれ自体でうまくコンパイルされ、もう1つは他のクラスからの関数/変数が必要であり、コンパイルしようとしましたが、それらは次のようにうまくコンパイルされました

class a {

*functions and variables for a* }

 class b {
 a A;
 *functions for b* }

この例のクラスbは、同じディレクトリ内の別のファイルにある場合、aを呼び出そうとすると機能しません。作成したスクリプトでエラーが発生します。

EDIT2:メイン関数を入れてクラスaとbから関数を呼び出すと、テストファイルでもエラーが発生します。(このエラーは関数を宣言していないことが原因であることはわかっていますが、関数をクラスで宣言しようとすると、別のエラーが表示されます: type::functionname はオーバーロードできませんが、a と b の両方の宣言を取り出すと正常にコンパイルされ、b は a の関数を使用できるのに、なぜ関数宣言なしで正常に実行できるのに、メイン関数では使用できないのでしょうか? また、関数をクラスに含めることができない場合は、関数の宣言をどこに置くのですか?それらをオーバーロードできないと言いますか?)

4

2 に答える 2

2

まず第一に、"public:" を 1 回だけ記述すれば、その後はすべて public になります ("private:" などを記述するまで)。

2番目-最初の「クラスb」が正しいようです。

3 番目 - 両方のクラスが同じファイルに記述されていますか? それとも別のファイルで?異なるファイルの場合 - のファイルに のファイルを含めましたab? それらは.hファイルですか、それとも.ccファイルですか?

編集:これがどうあるべきか、今のところ単一のファイルとしましょう:

1 つのファイル、main.cc:

#include <string>
#include <vector>
#include <iostream>
using namespace std;

class a {
  string user;
public:
  string user2;
  vector<string> friendList;

  void userName()
  {
      cout <<"blah blah"<<endl;
      cin >> user;
  }
  void addFriend()
  {
      cout <<"blah blah"<<endl;
      cin >> user2;
      friendList.push_back(user2);
  }

  string getName()
  {
      return user;
  }
};

class b {
  string message, username;
  a User;
public: 
  void postMessage()
  {
      cout <<"blah blah"<<endl;
      getline(cin, message);

      username = User.getName();
  }
};

int main(){
  b test;
  test.postMessage();
}

クラスには明らかに多くの問題がありますが、これは少なくともコンパイルする必要があります。

于 2013-09-29T01:54:52.517 に答える