我的代码是:
#pragma once
#include "stdafx.h"
#include <vector>
#include "field.h"
class output
{
void putAtLocation(COORD, char chIcon); //currently this outputs to console
static std::vector<COORD> m_vsOutputBuffer;
public:
output(void);
static void addToken(COORD);
void drawTokens();
~output(void);
};
并且链接器错误是:
output.obj : error LNK2001: unresolved external symbol "private: static class std::vector<struct _COORD,class std::allocator<struct _COORD> > output::m_vsOutputBuffer" (?m_vsOutputBuffer@output@@0V?$vector@U_COORD@@V?$allocator@U_COORD@@@std@@@std@@A)
这一定是问题界限:
static std::vector<COORD> m_vsOutputBuffer;
我已经坚持了几个小时。 我终于注意到将我读过它(链接器错误)通常是由依赖性问题引起的。 COORD
更改为int
会导致链接器错误消失。但是这里它只是改变了一个我也读过它可能是因为它本身不应该使用一个函数。我认为它必须是处理TYPE
。COORD
的方式;或者COORD
S的某些内容是向前声明的,或者在output.cpp中正确引用。
编辑: 所有更改为int的都是make编译器错误,导致它永远不会访问链接器。现在我又回来了
和cpp文件:
#include "stdafx.h"
#include "output.h"
#include <vector>
static std::vector<int> m_vsOutputBuffer;
output::output(void)
{
}
void output::addToken(COORD sCoordinate) //mark a coord in the buffer as needing refreshed
{
m_vsOutputBuffer.push_back(sCoordinate);
}
void output::drawTokens() //release the outputbuffer the the output window
{
for (unsigned int iii = 0; iii < m_vsOutputBuffer.size(); iii++)
{
putAtLocation(m_vsOutputBuffer[iii], field::checkHit( m_vsOutputBuffer[iii] ) );
}
}
void output::putAtLocation(COORD sCoordinate, char chIcon) //outputs a single character to the console
{
DWORD dwNumWritten = 0;
LPDWORD lpdNumWritten = &dwNumWritten;
WriteConsoleOutputCharacter(
GetStdHandle( STD_OUTPUT_HANDLE ), //***repeatedly getting this handle may end up a bottleneck
LPCTSTR(&chIcon),
1,
sCoordinate,
lpdNumWritten
);
}
output::~output(void)
{
}
我也发现了这个:http://www.cplusplus.com/forum/general/6111/
所以我尝试将静态语句移动到cpp文件并编译并运行。但不是它不是一个成员变量。所以我需要以某种方式向前声明向量。(在声明之前还在头文件中创建静态对象。
答案 0 :(得分:1)
您需要.cpp
文件中的这一行:
std::vector<COORD> output::m_vsOutputBuffer;
(注意缺少static
和范围output::
)
这是成员变量的实际定义。课堂上的内容(.h
)只是声明。
如果没有这个,静态变量output:m_vsOutputBuffer
就不存在了,链接器正确地抱怨它无法找到它。
答案 1 :(得分:0)
Coord在windows.h头文件中定义...如果有类似内容,请查看stdafx.h
#include <windows.h>
。
除此之外我试图复制你的代码添加这个标题并编译它..顺利
编辑版本: 你可能忘了改变
static std::vector<int> m_vsOutputBuffer;
回到
static std::vector<COORD> m_vsOutputBuffer;
但是我假设你之前已经这样了。第二件事是你不必在header和cpp文件中包含相同的头文件,但这不会导致它..它是cpp文件中的行与< / p>
static std::vector<COORD> m_vsOutputBuffer;
将其改为:
std::vector<COORD> output::m_vsOutputBuffer;
简单地说你需要定义不只是声明。