下载了 code::blocks 感觉挺好的,很轻,功能也不错,不过好像我使用姿势不对?
写了Stackcal.h
Stackcal.cpp
定义一个堆栈类
//this is *.h
#ifndef _STACKCAL_H
#define _STACKCAL_H
class StackCal{
private:
int MAXSIZE;
char* stack_ptr;
char* stack_g;
public:
StackCal(int t);
~StackCal();
bool push(char s);
char pop();
bool isempty();
bool isfull();
};
#endif
//this is *.cpp
#include "stackcal.h"
StackCal::StackCal(int t){
MAXSIZE = t;
stack_g = new char[MAXSIZE];
stack_ptr = &stack_g[0];
}
StackCal::~StackCal(){
delete[] stack_g;
}
bool StackCal::isempty(){
return stack_ptr==&stack_g[0] ? true : false;
}
bool StackCal::isfull(){
return stack_ptr==&stack_g[MAXSIZE+1] ? true : false;
}
bool StackCal::push(char s){
if (isfull()){
return false;
}
*stack_ptr++ = s;
return true;
}
char StackCal::pop(){
if (isempty()){
return 'x';
}
char result = *--stack_ptr;
return result;
}
然后另一个文件中调用
#include "stackcal.h"
#include <iostream>
int main(){
StackCal op = StackCal(10);
char a = 'a';
char b = 'b';
op.push(a);
op.push(b);
std::cout << op.pop() << std::endl;
std::cout << op.pop() << std::endl;
return 0;
}
调用时#include <Stackcal.h>
报错:
undefined reference to `StackCal::StackCal(int)'
undefined reference to `StackCal::push(char)'
undefined reference to `StackCal::push(char)'
undefined reference to `StackCal::pop()'
undefined reference to `StackCal::pop()'
undefined reference to `StackCal::~StackCal()'
undefined reference to `StackCal::~StackCal()'
当改为包含*.cpp
文件#include <Stackcal.cpp>
正常过编译
求教,是我哪里姿势不对吗....
1
chenstack 2018-09-09 12:09:10 +08:00
推测是原先 Stackcal.cpp 未参与编译,印象中要先配置一下 code::blocks,或者检查一下是否是编译整个项目而不是单个文件
|
2
zyqf 2018-09-09 12:09:27 +08:00 via Android
你可以理解 include 为把文件代码插入该行。
|
3
whoami9894 OP @chenstack
嗯,我想就是包含头文件的话,ide 可能没有把类的实现包含进来 |
4
chungzh 2018-09-09 12:19:33 +08:00
你试试把 Stackcal.cpp 也在主程序里 include 一下
|
5
newtype0092 2018-09-09 13:23:42 +08:00
你自己用过 gcc 命令直接编译么? include 头文件只是告诉编译器我调用的这些函数、类是有定义过的,具体调用的话是连定义这些函数、类的文件一起编译才行。
具体编译执行的命令可以看到,你看下有没有加入 Stackcal.cpp ,没有的话自己搜下多文件编译相关的设置就好了。 其实开始的时候还是直接命令行 gcc、g++直接去编译的好,能让你了解下具体的编译、链接的流程,报出的错误也很明确是那一步错了,等熟悉了流程再用 IDE,报出这类错误你也大概知道是哪部分的问题了,因为各个 IDE 的设置都不太一样,只要明确了问题,就算对 IDE 不熟悉,也知道该搜哪些相关的设置。 |
6
GeruzoniAnsasu 2018-09-09 13:26:23 +08:00 via Android
新建工程
添加文件到工程 |
7
whoami9894 OP |
8
innoink 2018-09-09 13:37:27 +08:00 via Android
链接过程没找到 stack 的编译单元
|
9
FrankHB 2018-09-16 06:42:29 +08:00
蛤?“堆栈”?_+大写字母标识符? int ? delete[]? accessor 没 const noexcept ?打死打死(
一看就是没添加 cbp 嘛,除此之外跟 C::B 有什么关系,怎么脑补出头文件包含问题的? 顺便很不巧,C::B 的头文件包含还真有个坑,因为它的 build system 是正则#include 的,所以#include 个宏名不会算到依赖更新里。不过你显然还没被坑到的程度…… |