如果没有头文件,如何定义静态成员?
代码:
class MyClass
{
};
int MyClass::staticMember; // Error: class MyClass has no member staticMember!
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
我声明一个动态数组int *idArray;,我想将值复制到a tempArray,然后我将更改顺序tempArray,但我不想更改顺序idArray,我怎么能写它?我试图实现它,但是当顺序tempArray改变时,顺序idArray也会改变.
int *idArray = new int[size];
int *tempArray = idArray;
int m, n;
for(int k = 0; k < size; k++) {
m = rand() % size;
n = tempArray[m];
tempArray[m] = tempArray[k];
tempArray[k] = n;
}
Run Code Online (Sandbox Code Playgroud) 请查看以下代码
Main.cpp的
#include <iostream>
using namespace std;
int main()
{
Class1 c;
}
Run Code Online (Sandbox Code Playgroud)
Class1.cpp
#include <iostream>
using namespace std;
class Class1
{
public:
void click1()
{
cout << "Click 1" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
Class2.cpp
#include <iostream>
using namespace std;
class Class2
{
public:
void click2()
{
cout << "Click 2" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
如果我将头文件添加到上面的类,它们可以工作.为什么C++在没有头文件的情况下不理解不同文件中的类?
由于指定的标准int a属于简单declaration.其实
simple-declaration:
decl-specifier-seq_opt init-declarator-list_opt ; //
attribute-specifier-seq decl-specifier-seq_opt init-declarator-list ;
type-specifier:
trailing-type-specifier //
class-specifier
enum-specifier
trailing-type-specifier:
simple-type-specifier //
elaborated-type-specifier
typename-specifier
cv-qualifier
simple-type-specifier:
nested-name-specifieropt type-name
nested-name-specifier template simple-template-id
char
char16_t
char32_t
wchar_t
bool
short
int //
long
signed
unsigned
float
double
void
auto
decltype-specifier
Run Code Online (Sandbox Code Playgroud)
因此int a是一个简单的声明.但是,如果我们重新声明a与以下相同的范围:
int a;
int a;
Run Code Online (Sandbox Code Playgroud)
我们有
test.cpp:4:5: error: redefinition of ‘int a’
test.cpp:3:5: error: ‘int a’ previously declared here
Run Code Online (Sandbox Code Playgroud)
到底究竟int a是什么?
说我有一些源代码MyAmoeba.cpp,带有相关的头文件MyAmoeba.h.在MyAmoeba.cpp中包含MyAmoeba.h是不错的做法?(我假设它从来没有必要,除了可能在一些设计糟糕的情况下,头文件包含一个宏来更改源文件)
据我所知,执行上述操作意味着如果您更改MyAmoeba.cpp中的任何内容的签名,但忘记在MyAmoeba.h中执行此操作,则错误将在编译阶段而不是在链接阶段发生,但我不确定这是好事/坏事/无关紧要的事情.
我对c ++ btw相当新,如果这个问题无论如何都是荒谬的(如果是这样的话,请指出我)
编辑:我正在玩一个只包含函数声明的头文件,但没有类/结构/等定义.从其他来源和下面的答案,在我看来,当头文件只有声明时,没有必要在相关的源文件中包含头文件,但如果头文件中有任何定义,那么它确实必要的(因为您可以根据需要多次声明,但只定义一次,并且显然可以使用定义代替声明,因此源文件中的函数定义将同时计为我的声明).
假设我有以下程序:
int main(void)
{
int i; //Line 1
i=5; //Line 2
int *j; //line 3
j=&i; //line 4
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试在Visual Studio中的第1行之后打印i,它会给出一个编译时错误,说明我使用的单元化变量.这是否意味着没有为i分配存储,而第1行只是一个声明?我理解第2行是一个定义.
还有,第3行和第4行呢?他们是宣言还是定义?
我正在通过编写公共数据结构来学习c ++,并且我有一个编译器警告我没有定义我的内联添加方法.
src/vector.h:10:14: warning: inline function 'Vector::add' is not defined
[-Wundefined-inline]
inline void add(const float val);
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?据我所知,方法匹配.但是,如果我删除内联方法,它工作正常,但第一次调用add需要11380us,但第二次和第三次是3667us左右 - 大约4倍的罚款成本.
SRC/vector.h
//#include <cstddef>
class Vector {
public:
explicit Vector(const int n);
explicit Vector(const int n, const float val);
float& operator[](const int i);
inline int const length();
inline void fill(const float val);
inline void add(const float val);
inline float sum();
private:
float* arr;
int len;
};
Run Code Online (Sandbox Code Playgroud)
src.vector.cpp
#include "vector.h"
#include <iostream>
#include <algorithm>
#include "yepCore.h"
#include "yepMath.h"
#include "yepLibrary.h"
#include <cstdlib>
using …Run Code Online (Sandbox Code Playgroud) C标准(ANSI [C89],C99,C11)中不允许嵌套函数(块作用域中的函数声明).
但我无法在C标准中找到它.
编辑:
为什么函数定义不能在函数定义中(复合语句)?
变量/函数可以声明多次,但只能定义一次。这实际上是什么意思?
我试图了解有关在线编译器的声明,但我期望显示错误,但事实并非如此。
#include <stdio.h>
int x=10;
int main() {
x=20;
x=30;
printf("%d",x);
}
Run Code Online (Sandbox Code Playgroud)
预期的输出:因为我已经定义了变量x并分配了三个不同的值10、20、30,所以我希望显示错误。这个概念说您可以声明变量多次,但只能定义一次,因为不能将两个不同的位置赋给同一变量实际输出:30
在我阅读了静态变量之后,有些事情让我感到困惑。我们可以说关键字 static 的作用是将变量的生命周期延长到程序的生命周期,因为变量的生命周期就是它存在的时间段。
我的问题是:
c++ ×6
c ×4
declaration ×3
definition ×3
arrays ×1
c++11 ×1
header-files ×1
inline ×1
standards ×1
static ×1
variables ×1