拆分函数的声明和定义,或删除标题中的新运算符?

时间:2017-01-04 16:39:27

标签: c++ include new-operator

我是C ++的新手,我的项目有困难。

Super.h

#pragma once
#include <iostream>

float *list=new float[10];

class Super{
public:
    void function(){}
};

A.H

#pragma once
#include "Super.h"

class A{  
public:
    void function();
};

A.cpp

#include "A.h"
void A::function(){
    std::cout<<"Working A!"<<std::endl;
}

的main.cpp

#include "A.h"

int main(int argc, const char * argv[]) {
    A a;
    a.function();
    return 0;
}

此代码未编译,(clang:错误:链接器命令失败,退出代码为1(使用-v查看调用))我发现是否删除

float *list=new float[10];

在Super.h中,它已编译。

但是,我需要可以在A类中访问的数组。所以我尝试了很多方法,发现如果我保留float数组就可以编译它,并结合A.h和A.cpp,比如

//Super.h    

float *list=new float[10];

class Super{

public:
    void function(){}
};

------------------------------------
// A.h

#pragma once
#include "Super.h"


class A{

public:    
    void function();
};

void A::function(){
    std::cout<<"Working A!"<<std::endl;
}

我是否必须结合A.cpp和A.h?还是我的设计不好?我使用XCode 8。

1 个答案:

答案 0 :(得分:0)

在您的实际代码中,“line”在Settings.h中声明,并在其drawPixel函数中使用。

它使用的唯一其他地方是main.cpp我将以相反的顺序讨论这些点,以便我们的讨论更有意义:

  • 清理:delete[] pixels您应该使用vector<float>代替,以避免与动态内存相关的所有问题:
    1. 如果在清理后调用drawPixel怎么办?
    2. 如果您的代码退出并出错,该怎么办?
    3. 您如何确保main函数不会提前退出并错过此内容?
  • 使用情况:glDrawPixels(width, height, GL_RGB, GL_FLOAT, pixels)最终glDrawPixels参数的类型为void*因此,如果您使用pixels正确替换vector<float>,则可以通过传递data(pixels)
  • 进行隐式转换
  • 初始化:fill_n(pixels, width*height * 3, 1.0f)而不是Settings.h,而应该定义pixelsvector<float> pixels(width * height * 3, 1.0F)您需要对系统进行这些更改,以避免全局变量:
    1. void draw()的所有实例都需要更改为void draw(vector<float>& pixels),并且当调用任何draw方法时,pixels将成为参数
    2. void drawPixel(const int& i, const int& j, const float& red, const float& green, const float& blue)应更改为void drawPixel(vector<float>& pixels, const int i, const int j, const float red, const float green, const float blue),对drawPixel函数的任何调用必须采用pixel,因为它是1 st 参数
    3. void drawLine(const int& i0, const int& j0, const int& i1, const int& j1, const float& red, const float& green, const float& blue)应更改为void drawLine(vector<float>& pixels, const int i0, const int j0, const int i1, const int j1, const float red, const float green, const float blue),对drawLine函数的任何调用必须采用pixel,因为它是1 st 参数