1

你能帮我解决 Visual C++ 中的这些错误吗?我是 C++ 新手,我从 NetBeans 导入了这段代码(设计模式工厂)。在 NetBeans 中,此代码是正确的。但现在我需要在 Microsoft Visual Studio 2010 中编译此代码,它会生成以下错误:

创建者.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);

创建者.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"

产品.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成员。定义至少一个,或删除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;
    }
}

当您返回本地对象的地址时,您将创建未定义的行为。该错误表明您声明返回 a Product,但实际上返回的是指向- 的指针Product。你在这里复制粘贴有什么问题吗?

确保您的声明

Product* createObject(int month);

符合你的定义

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

我无法从这里发现错误...

编辑

查看您的代码后,我发现以下错误:

  • stdafx.h被太多的包含“毒害”了,尤其是using namespace std;- 声明性的,永远不要那样做!!!
  • 您没有为ProductAand定义构造函数ProductB,结果是另一个错误
  • 不要void显式使用作为方法/函数的参数,这是C-style

尽管这听起来像是额外的工作,但尽量不要将其引入namespace std全局命名空间 -> refrain from using namespace std;,尤其是在头文件中!

如果没有特别的理由使用预编译的头文件创建项目(stdafx.h并且targetver.h,不要这样做,因为它会使事情复杂化!)

我设法构建了您的项目,但使用的是 Visual Studio 2012 Express。如果您无法从我上传的文件中重新编译项目,请查看源文件并复制内容。

我将解决方案上传到我的SkyDrive帐户。

如果这对您有所帮助,请接受作为答案。

于 2013-05-25T14:36:30.530 回答