【问题标题】:Visual Studio 2010- fatal error LNK1120: 1 unresolved externals; c++Visual Studio 2010 - 致命错误 LNK1120: 1 unresolved externals; C++
【发布时间】:2015-10-24 05:49:43
【问题描述】:

我收到了错误:

asteroid.obj:错误 LNK2001:无法解析的外部符号“私有: 静态字符 (* Asteroid::Image)[4]" (?Image@Asteroid@@0PAY03DA) 1>C:\用户\约翰\文档\Visual Studio 2010\Projects\assignment3.1\Debug\assignment3.1.exe:致命错误 LNK1120: 1 个未解决的外部问题

而且我没有看到代码中的问题。我的程序中唯一改变的是我的“Image”和“LoadImage”成员函数。

这就是我在头文件中的代码现在的样子(跳过一些公共函数)

class Asteroid
{
private:
static const int ROWS = 3;
static const int COLUMNS = 4;
int row;
int column;
int row_size;
int column_size;
unsigned int ore_value;
static char Image[ROWS][COLUMNS];

public: static void LoadImage();
};

这就是 .cpp 文件中 LoadImage() 函数的样子

void Asteroid::LoadImage()
{
string myline;
ifstream asteroid_image_data("asteroid.txt");
if (asteroid_image_data.fail())
{
    cerr << "Asteroid image file is not available" << endl;
    return;
}

for (unsigned int i = 0; i < ROWS; i++)
{
    getline(asteroid_image_data, myline, '\n');
    if (!asteroid_image_data)
    {
        cerr << "Asteroid image file is missing some data" << endl;
        return;
    }

    for (unsigned int j = 0; j < COLUMNS; j++)
    {
        Image[i][j] = myline[j];
    }
}
asteroid_image_data.close();
}

来自main.cpp的调用只是

Asteroid::LoadImage();

【问题讨论】:

  • 如果你定义图像不是静态的会发生什么?
  • 您的链接未显示您的所有代码
  • @MORTAL 我得到::: 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38):错误 C2597:非法引用非静态成员 'Asteroid::Image' 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38):错误 C3867 : 'Asteroid::Image': 函数调用缺少参数列表;使用 '&Asteroid::Image' 创建指向成员 1>c:\users\john\documents\visual studio 2010\projects\assignment3.1\assignment3.1\asteroid.cpp(38) 的指针:错误 C2109:下标需要数组或指针类型
  • 很难知道是什么原因造成的。以及如何在没有代码的情况下修复它。如果您的代码很长,您可能需要编写 min-example

标签: c++ visual-studio visual-studio-2010 visual-studio-2012


【解决方案1】:

你必须为静态字符数组添加一个定义

下面是头cpp文件中的操作方法:

   char Asteroid::Image[3][4] = { {'0','0','0','0'},
                                  { '0','0','0','0'},
                                  { '0','0','0','0'}
                                };

或者

   char Asteroid::Image[3][4];

这样没问题,行得通

Your header file (Header.h):

        #pragma once

        #include <string>

        using namespace std;

        class Asteroid
        {
        private:
            static const int ROWS = 3;
            static const int COLUMNS = 4;
            int row;
            int column;
            int row_size;
            int column_size;
            unsigned int ore_value;
            static char Image[ROWS][COLUMNS];

            public: static void LoadImage();
        };

Header.cpp:

#include "Header.h"
#include <fstream>
#include <iostream>

using namespace std;

void Asteroid::LoadImage()
{
    string myline;
    ifstream asteroid_image_data("asteroid.txt");

    if (asteroid_image_data.fail())
    {
        cerr << "Asteroid image file is not available" << endl;
        return;
    }

    for (unsigned int i = 0; i < ROWS; i++)
    {
        getline(asteroid_image_data, myline, '\n');

        if (!asteroid_image_data)
        {
            cerr << "Asteroid image file is missing some data" << endl;
            return;
        }

        for (unsigned int j = 0; j < COLUMNS; j++)
        {
            Image[i][j] = myline[j];
        }
    }
    asteroid_image_data.close();
}

char Asteroid::Image[3][4];

主文件(Source.cpp):

    #include <iostream>
    #include "Header.h""

    int main() {

        Asteroid::LoadImage();
    }

【讨论】:

  • 是的,我认为 OP 没有声明图像。你可以像这样声明它char Asteroid::Image[3][4] 没有{{0}} 编译会将它初始化为零,因为它是静态的。
  • 没关系,我可以改一下
  • 哦,是的,我现在明白了,再次感谢,他有我认为的选择
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2011-02-09
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多