我该如何在我的C++项目中声明全局变量?

3
我有两个矩阵作为全局变量。然而,当我运行我的项目时,我在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__) */

我的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;
        }
    }
}

我的 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;
}

我之前遇到过这个问题,但是通过去掉全局变量来解决了它。然而,我确实需要优化这段代码,使用全局变量是解决方案,所以我需要想出办法。谢谢!


6
你应该避免它们。 - Iharob Al Asimi
有时候你无法避免不可避免的事情。 - user3125367
哎呀,我正在进行奇异值分解的数据集非常庞大。我应该返回并传递指针数组吗? - cut936
1个回答

8
在头文件中,仅声明它们。
extern const float GLOBAL_AVG_SET1;
extern const float GLOBAL_AVG_SET2;

extern const int TOTAL_USERS;
extern const int TOTAL_MOVIES;

extern double **user_feature_table;
extern double **movie_feature_table;

在您的其中一个 .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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接