C++ 我应该如何在我的C++;项目

C++ 我应该如何在我的C++;项目,c++,include,global-variables,header-files,C++,Include,Global Variables,Header Files,我有两个矩阵作为全局变量。然而,当我运行我的项目时,我在xCode中得到一个apache Mach-O链接器错误,它说我的全局变量被多次声明。我已经确定问题在于全局变量的放置和头文件的导入 我的svd.h在这里: #ifndef __netflix_project__svd__ #define __netflix_project__svd__ #include <stdio.h> #include "dataManager.h" const float GLOBAL_AVG_SE

我有两个矩阵作为全局变量。然而,当我运行我的项目时,我在xCode中得到一个apache Mach-O链接器错误,它说我的全局变量被多次声明。我已经确定问题在于全局变量的放置和头文件的导入

我的svd.h在这里:

#ifndef __netflix_project__svd__
#define __netflix_project__svd__

#include <stdio.h>
#include "dataManager.h"

const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;

const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;

double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];


void initialize(int num_features);
void train();
double predictRating(int user, int movie); 




#endif /* defined(__netflix_project__svd__) */
\ifndef\uuu netflix\uu项目\uuu svd__
#定义netflix项目svd__
#包括
#包括“dataManager.h”
常量浮点全局平均设置1=3.608609;
常量浮点全局平均设置2=3.608859;
const int TOTAL——用户总数=458293;
总成本=17770;
double**user\u feature\u table=新的double*[用户总数];
双**电影功能表=新双*[总电影];
无效初始化(int num_特征);
无效列车();
双重预测评级(int用户、int电影);
#endif/*已定义(uuu netflix_uProject_uuuSVD_uuu)*/
我的svd.cpp在这里:

#include "svd.h"



void initialize(int num_features) {

    for(int i = 0; i < TOTAL_USERS; i++) {

        user_feature_table[i] = new double[num_features];

        for(int k = 0; k < num_features; k++) {
            user_feature_table[i][k] = GLOBAL_AVG_SET2 / num_features;
        }
    }

    for(int i = 0; i < TOTAL_MOVIES; i++) {

        movie_feature_table[i] = new double[num_features];

        for(int k = 0; k < num_features; k++) {
            movie_feature_table[i][k] = GLOBAL_AVG_SET2 / num_features;
        }
    }
}
#包括“svd.h”
无效初始化(int num_特性){
对于(int i=0;i<总用户数;i++){
用户特征表[i]=新的双[num\u特征];
对于(int k=0;k
我的main.cpp如下所示:

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






int main(int argc, const char * argv[]) {

    // Parse file and store test points as testPoint objects
    std::vector<testPoint*> dataSet = fillTestPoints();


    // Get global average of data set

    /*
    double avg = getGlobalAverage(dataSet);
    printf("%f", avg);
     */
    initialize(30);

    for(int i = 0; i < TOTAL_USERS; i++) {
        printf("%f\n", user_feature_table[i][0]);
    }

    return 0;
}
#包括
#包括“svd.h”
int main(int argc,const char*argv[]{
//解析文件并将测试点存储为测试点对象
std::vector dataSet=fillTestPoints();
//获取数据集的全局平均值
/*
双平均值=getGlobalAverage(数据集);
printf(“%f”,平均值);
*/
初始化(30);
对于(int i=0;i<总用户数;i++){
printf(“%f\n”,用户特征表[i][0]);
}
返回0;
}
我以前遇到过这个问题,但通过去掉全局变量解决了它。然而,我确实需要优化这段代码,使用全局变量是实现这一点的方法,所以我确实需要弄清楚这一点。谢谢

在头文件中,仅声明它们

在一个.cpp文件中,定义并初始化它们:

const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;

const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;

double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];

实际上,你应该避免它们。有时你无法避免不可避免。嗯,我正在做SVD的数据集是巨大的。那么我应该返回并传递指针数组吗?
const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;

const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;

double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];