1

Visual C++ のこれらのエラーについて教えてください。私は C++ の初心者で、NetBeans からこのコード (設計パターン Factory) をインポートしました。NetBeans では、このコードは正しいです。しかし、Microsoft Visual Studio 2010 でこのコードをコンパイルする必要があり、これらのエラーが発生しています。

Creator.h

#pragma once

#include "stdafx.h"


class Creator
{
     public:
     Product* createObject(int month);
     private:
};

エラー:

  • エラー C2143: 構文エラー: ';' がありません ' ' の前- 製品createObject(int month)
  • エラー C4430: 型指定子がありません - int と見なされます。注: C++ は、オンラインで default-int をサポートしていません - Product* createObject(int month);

Creator.cpp

#include "stdafx.h"

Product* Creator::createObject(int month) {
    if (month >= 5 && month <= 9) {
        ProductA p1;
        return &p1;
    } else {
        ProductB p2;
        return &p2;
    }
}

エラー:

IntelliSense: 宣言は " Creator::createObject(int mesic)" と互換性がありません (9 行目で宣言されています - これは Product createObject(int month); です)

stdafx.h:

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
using namespace std;
#include "Creator.h"
#include "Product.h"
#include "ProductA.h"
#include "ProductB.h"

Product.h:

#pragma once
#include "stdafx.h"

class Product
{
 public:
virtual string zemePuvodu() = 0;
Product(void);
~Product(void);
};

製品.cpp:

次のものだけがあります。

#include "stdafx.h"

Product::Product(void)
{
}


Product::~Product(void)
{
}

答えてくれてありがとう。

4

1 に答える 1

1

class Creator
{
 public:
 Product* createObject(int month);
 private:
};

privateメンバーを指定していません。少なくとも 1 つを定義するか、次を削除しprivate:ます。

class Creator
{
 public:
 Product* createObject(int month);

};

Product* Creator::createObject(int month) {
    if (month >= 5 && month <= 9) {
        ProductA p1;
        return &p1;
    } else {
        ProductB p2;
        return &p2;
    }
}

ローカル オブジェクトのアドレスを返すため、未定義の動作が作成されます。エラーは、を返すように宣言したことを示してProductいますが、実際にはへのポインターを返していますProduct。ここに何か間違ったものをコピーして貼り付けましたか?

あなたの宣言を確認してください

Product* createObject(int month);

あなたの定義を満たす

 Product* Creator::createObject(int month) { ... }

ここからエラーを見つけることはできません...

編集

コードを確認したところ、次のエラーが見つかりました。

  • あなたstdafx.hはあまりにも多くのインクルード、特に宣言型によって「中毒」になりました。絶対にそうしusing namespace std;ないでください!!!
  • ProductAandのコンストラクターを定義していませんでしたProductB。これは別のエラーであることが判明しました
  • voidメソッド/関数の引数として明示的に使用しないでください。これはC-styleです

追加の作業のように聞こえるかもしれませんがnamespace std、グローバル名前空間に導入しないようにしてください ->using namespace std;特にヘッダーファイルでは控えてください!

プリコンパイル済みヘッダーを使用してプロジェクトを作成する特別な理由がない場合 (複雑stdafx.htargetver.hなるため、そうしないでください!)

プロジェクトをビルドできましたが、Visual Studio 2012 Express を使用しています。私のアップロードからプロジェクトを再コンパイルできなかった場合は、ソース ファイルを見て内容をコピーしてください。

ソリューションをSkyDriveアカウントにアップロードしました。

これが役に立った場合は、回答として受け入れてください。

于 2013-05-25T14:36:30.530 に答える