-4

C++ の一部のコードで小さな問題が 1 つあります。コンパイルできません。プログラミングのスキルは今のところあまり高くありません。助けていただければ幸いです。事前にタイ。

問題は、どこにエラーがあり、どのようにコードを修正するかです

#include<iostream>
using namespace std;
struct S {
      S(int i){ this->x = i;}
      ~S(){}
    int x;
    static const int sci = 200;
    int y = 999; 
}
void main(){
    S *ps = new S(300);
    ps->x = 400;

    S s;
    s.x = 500;
}

コンパイラ出力:

8   13  [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
9   1   [Error] expected ';' after struct definition
10  11  [Error] '::main' must return 'int'
In function 'int main()':
14  7   [Error] no matching function for call to 'S::S()'
14  7   [Note] candidates are:
4   7   [Note] S::S(int)
4   7   [Note] candidate expects 1 argument, 0 provided
3   8   [Note] S::S(const S&)
3   8   [Note] candidate expects 1 argument, 0 provided

========アフターマッチ;) ===========

コード:

#include<iostream>
using namespace std;
struct S {
    S() : x() {}       // default constructor
    S(int i) : x(i) {} // non-default constructor
    ~S(){} // no need to provide destructor for this class
    int x;
    static const int sci = 200;
    int y = 999; // Only valid since C++11
}; // ; after class definition.
int main(){
    S *ps = new S(300);
    ps->x = 400;

    S s;
    s.x = 500;
}

としても:

#include<iostream>
using namespace std;
struct S {
    S(int i){
        this->x = i;
    }
    ~S(){}
    int x;
    static const int sci = 200;
    int y = 999;
};
int main(){
    S *ps = new S(300);
    ps->x = 400;
    S *s = new S(20);
    s->x = 500;
}

働いた!TY さん、juanchopanza さん、Paul Renton さん、そして時間を割いて私を助けてくれた他のすべての人に感謝します!

4

3 に答える 3

3

デフォルト以外のコンストラクターを宣言したため、コンパイラーはコンストラクターを生成しなくなります。したがって、デフォルトのものを提供する必要があります。この行に必要です。

S s;

この注釈付きの例のように、コンストラクターの初期化リストも使用する必要があります

struct S {
    S() : x() {}       // default constrictor
    S(int i) : x(i) {} // non-default constructor
      ~S(){} // no need to provide destructor for this class
    int x;
    static const int sci = 200;
    int y = 999; // Only valid since C++11
}; // ; after class definition.

あなたのコードは、C++11 の 1 つの機能、つまり宣言の時点での非静的データ メンバーの初期化を使用しています。このためには、-std+c++11フラグを渡す必要があります。

また、void main()有効な C++ ではありません。main()返さなければなりませんint

于 2013-07-11T20:28:00.420 に答える
1

コンパイラエラーにも記載されているいくつかのこと

クラス定義を閉じるのと同じように、セミコロンで構造体宣言を終了する必要があります。

そう、

struct S {
  S(int i){ this->x = i;}
  ~S(){}
int x;
static const int sci = 200;
int y = 999; 
}; // add semi colon

また、コンストラクターを提供したため、コンパイラーはデフォルトのコンストラクターを生成しなくなりました。

だから、S s; は無効であり、既定のコンストラクターを提供するか、x の既定値が指定されていない場合はそれを提供する必要があります。

struct S {
  S(int i = 3){ this->x = i;} // Add a default value
  ~S(){}
int x;
static const int sci = 200;
int y = 999; 
};

編集:millsjによる提案

また、構造体内にデフォルトを設定する場合は、 -std=c++11 フラグを使用することをお勧めします

int y = 999; // Only valid in C++11

最後に、

void ではなくmain で int を返したい。

int main() // not void main()

うまくいけば、これがすべて役に立ちます!私たちは皆、ある時点で初心者でした。

于 2013-07-11T20:32:20.533 に答える
0
#include<iostream>
using namespace std;
struct S {
      S(int i){ this->x = i;}
      ~S(){}
    int x;
    static const int sci = 200;
    int y = 999; //<-- c++11, use the -std=c++11 flag on the compiler command line.
}; //<-- need a semicolon
int main(){ //<-- main must return int
    S *ps = new S(300);
    ps->x = 400;

    S s(500); //<-- must supply parameter since there is no default constructor.
    s.x = 500;

    delete ps; //<-- need to delete memory allocated with `new`

    return 0; //<-- main must return int
}

それはリストされているエラーのように見えます。これらを修正して再コンパイルすると、さらに増える可能性があります。

于 2013-07-11T20:35:46.073 に答える