关于我的项目的背景:
这次在我大学的项目中,我必须创建一个Windows窗体应用程序(底部将介绍有关这些工具的信息)。此应用程序可以训练其神经网络识别狗的图像及其名称(名称分配给此应用程序中的数据)。
在应用程序中,我有三种形式:主窗体(如主菜单),训练窗体和识别窗体。
当我启动此应用程序时,我希望这三个表单访问相同的全局数据,我将其放在文件Globals.h
和Globals.cpp
中。我想在主窗体中初始化这些全局变量,并且我想在主窗体(训练和识别表单)之外使用和更新这些全局变量。
以下是这些全局变量的代码:
Globals.h
代码:
#pragma once
#include <fann.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Globals {
public:
static fann *ann;
static map<string, string> nameMap;
static int pictureCount;
public:
static void initializeNeuralNetwork();
static void insertNewDog(string /*output*/, string /*name*/);
static string getNameOfDog(string /*output*/);
static void incrementPictureCount();
static fann * getAnn();
static void trainNeuralNetwork(struct fann_train_data *data, int max_epochs,
int epochs_between_reports,
float desired_error);
static void saveNeuralNetwork();
static int getPictureCount();
};
Globals.cpp
代码:
#include "stdafx.h"
#include "Globals.h"
using namespace std;
void Globals::initializeNeuralNetwork() {
ann = fann_create_from_file("ann.net");
if (!ann) {
ann = fann_create_standard(3, 49, 38, 8);
}
fann_set_activation_function_layer(ann, FANN_SIGMOID, 0);
fann_set_activation_function_layer(ann, FANN_SIGMOID, 1);
fann_set_activation_function_layer(ann, FANN_SIGMOID, 2);
pictureCount = 0;
}
void Globals::insertNewDog(string output, string name) {
nameMap.insert( pair<string, string>(output, name) );
}
string Globals::getNameOfDog(string output) {
if (nameMap.empty()) return "";
string result = (nameMap.count(output)) ? nameMap[output] : "ERROR";
return result;
}
fann * Globals::getAnn() {
return ann;
}
void Globals::trainNeuralNetwork(struct fann_train_data *data,
int max_epochs, int epochs_between_reports, float desired_error) {
fann_train_on_data(ann, data, max_epochs, epochs_between_reports, desired_error);
}
void Globals::saveNeuralNetwork() {
fann_save(ann, "ann.net");
}
void Globals::incrementPictureCount() {
pictureCount++;
}
int Globals::getPictureCount() {
return pictureCount;
}
问题:
我试图寻找类似于我的问题,但到目前为止还没有发现任何问题。问题是,当我尝试在Training表单中调用这些全局变量的方法时,我在尝试运行应用程序时从输出中得到了这些LNK *错误:
1>------ Build started: Project: DogBreedRecognizer-Group6, Configuration: Debug Win32 ------
1> DogBreedRecognizer-Group6.cpp
1>c:\users\baskoro indrayana\documents\visual studio 2010\projects\dogbreedrecognizer-group6\dogbreedrecognizer-group6\TrainingForm.h(654): warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdlib.h(867) : see declaration of 'itoa'
1>c:\users\baskoro indrayana\documents\visual studio 2010\projects\dogbreedrecognizer-group6\dogbreedrecognizer-group6\TrainingForm.h(664): warning C4244: 'argument' : conversion from 'int' to 'fann_type', possible loss of data
1>c:\users\baskoro indrayana\documents\visual studio 2010\projects\dogbreedrecognizer-group6\dogbreedrecognizer-group6\TrainingForm.h(703): warning C4305: 'argument' : truncation from 'double' to 'float'
1>Globals.obj : error LNK2020: unresolved token (0A000023) "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > Globals::nameMap" (?nameMap@Globals@@$$Q2V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@2@@std@@A)
1>Globals.obj : error LNK2020: unresolved token (0A000028) "public: static int Globals::pictureCount" (?pictureCount@Globals@@$$Q2HA)
1>Globals.obj : error LNK2020: unresolved token (0A00002D) "public: static struct fann * Globals::ann" (?ann@Globals@@$$Q2PAUfann@@A)
1>Globals.obj : error LNK2001: unresolved external symbol "public: static int Globals::pictureCount" (?pictureCount@Globals@@$$Q2HA)
1>Globals.obj : error LNK2001: unresolved external symbol "public: static struct fann * Globals::ann" (?ann@Globals@@$$Q2PAUfann@@A)
1>Globals.obj : error LNK2001: unresolved external symbol "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > Globals::nameMap" (?nameMap@Globals@@$$Q2V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@2@@std@@A)
1>C:\Users\Baskoro Indrayana\Documents\Visual Studio 2010\Projects\DogBreedRecognizer-Group6\Debug\DogBreedRecognizer-Group6.exe : fatal error LNK1120: 6 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
如果你想看到我调用这个Globals类的方法的代码,下面是表格的代码:
所以,我的问题是:
使用的工具: Visual C ++ 2010 Express Edition(我必须使用它,因为我的大学任务指示我们,所以没有选择使用任何其他IDE /语言/工具,如果你问。)
这一切都来自我。我会等待你对我的问题的回答,我很感激。谢谢。