- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我尝试选择 C++,为此我决定使用模板编写一个通用的 Group 类,它将 Type 和 size 作为模板参数:
在 group.h 中:
#ifndef __GROUP_H
#define __GROUP_H
#define MAX_SIZE 10
/**********************************************************
* Define a Group class that handles a collection of members
* of some Type
**********************************************************/
template <class Type, int max>
class Group {
private:
std::string name;
int count, size;
Type * members[max];
public:
Group();
Group(const std::string & _name);
~Group();
// display instance info
virtual void show();
// add member
void add_member(Type &);
// list memebers
void list();
// name setter/getter
void set_name(const std::string &);
const std::string & get_name();
};
#endif
group.cc:
/**********************************************************
* class methods for Group
**********************************************************/
template <class Type, int max>
Group<Type, max>::Group() : count(0), size(max), name("New Group") {};
template <class Type, int max>
Group<Type, max>::Group(const std::string & _name) : name(_name), count(0), size(max) {};
template <class Type, int max>
Group<Type, max>::~Group() {
int i = 0;
while(i < this->count) {
delete this->members[i];
++i;
}
}
template <class Type, int max>
void Group<Type, max>::show() {
std::cout << "<#Group - Name: " << this->name << ", Members: " << this->count << "/" << this->size << " >\n";
}
template <class Type, int max>
void Group<Type, max>::add_member(Type & member) {
if (this->count < this->size) {
this->members[this->count] = &member;
this->count++;
} else {
std::cout << "Error - this Group is full!\n";
}
}
template <class Type, int max>
void Group<Type, max>::list() {
int i = 0;
std::cout << "The following are members of the Group " << this->name <<":\n";
// assumes the member has a show() method implemented
while (i < this->count) {
std::cout << i << ". ";
(this->members[i])->show();
++i;
}
}
template <class Type, int max>
void Group<Type, max>::set_name(const std::string & _name) {
this->name = _name;
}
template <class Type, int max>
const std::string & Group<Type, max>::get_name() {
return this->name;
}
我还实现了一个 Person 类和一个 Employee 类(继承自 Person),它们都可以工作并具有 show() 方法。
我的主图是这样的:
test.cc
#include <iostream>
#include "group.h" // this also has the declarations and implementation for Person/Employee
int main (int argc, char const *argv[])
{
// Person ctor takes name and age
Person p1("John", 25);
Person p2("Jim", 29);
// Group takes name to init
Group <Person, 5> g("Ozcorp");
g.add_member(p1);
g.add_member(p2);
g.list();
}
我用一个简单的 Makefile 编译了它:
test: test.cc group.o
g++ -o test test.cc group.o
group.o: group.h group.cc
g++ -c group.cc
最后(哇),当我用 ./test
运行它时,出现了以下错误:
Undefined symbols:
"Group<Person, 5>::list()", referenced from:
_main in ccaLjrRC.o
"Group<Person, 5>::Group(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
groups() in ccaLjrRC.o
_main in ccaLjrRC.o
"Group<Person, 5>::~Group()", referenced from:
groups() in ccaLjrRC.o
_main in ccaLjrRC.o
_main in ccaLjrRC.o
"Group<Person, 5>::add_member(Person&)", referenced from:
_main in ccaLjrRC.o
_main in ccaLjrRC.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [test] Error 1
如果您做到了这一点 - 谢谢 - 我会很感激您能提供一些关于为什么会发生这种情况的见解。我试图从代码中尽可能多地分享(显然),所以请原谅我,如果它太多了。源代码是在 mac osx 10.6.4 上用 g++ 4.2.1 编译的。此外,我们将不胜感激任何风格/良好的编码习惯提示。谢谢!
最佳答案
模板化类成员定义不会进入 .cc/.cpp 文件。它们进入 .h 或 .h 包含的 .hpp/.hxx 文件原因是 .cc/.cpp 文件用于构建对象文件。但是,对于模板化代码,在替换模板化参数之前无法创建对象。因此,它们的实现必须可用于实例化它们的所有代码片段:在类似 .h 的文件中。
关于c++ - g++ 使用模板时出现重复符号错误(菜鸟问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318915/
我目前正在尝试让 g++ 工作,并查看 http://gcc.gnu.org/install/build.html ,我似乎找不到它在哪里说如何“执行编译器的 3 阶段 bootstrap ”。我在哪
James Powell 在他对即将举行的演示文稿的简短描述中说,他自豪地发明了最粗糙的 Python 单行代码之一: (None for g in g if (yield from g) and F
请告诉我我的证明是否正确 We have a connected graph, and specific vertex u in V(G). Suppose we compute the dfs tr
下面的test2和test3结果是不同的。 我对此感到困惑,因为它看起来像相同的逻辑,并且与linux bash ||逻辑不同。 $data = @( [PSCustomObject]@{St
我试图找到一个明确的 G 代码语法规范,而不是单个 G 代码的含义,我无处不在的规范,我的意思是详细的语法规范,目的是编写解析器。 我编写解析器没有问题,我只是在寻找语法规范,例如。我知道您不必总是为
我写了这个 mixin,但它循环了很多时间。你能帮我优化我的代码吗?或者你能建议一些其他的东西来获得想要的结果吗? dfgdfgsdfgsdf 最佳答案 希望这就是您要找的。 $spaces: (4,
默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question : struct Foo { void bar() {} void baz(
是否可以将文件内容通过管道传送到 g++编译程序? 我想这样做是因为我想使用数据库中的文件而不是磁盘上的物理文件。可以通过我制作的 API 轻松检索文件内容。 例如,我想做这样的事情: g++ con
如何profile c++代码获取每行代码的调用次数和消耗时间,就像profile工具一样在 Matlab 中呢? 我尝试使用-fprofile-arcs之类的东西,但它只生成代码覆盖率报告,其中可以
如何在几行代码上禁用所有警告。可以使用 GCC 诊断功能禁用特定警告,但是否有针对所有警告的标志。我尝试了这个方法,但不起作用 #pragma GCC diagnostic push #pragma
我有一个链接到 opencv 2.2 的可执行文件。但是,我删除了 opencv 2.2 并安装了 opencv 2.3。 问题是,有没有办法在不重新编译整个源代码的情况下将这个可执行文件链接到新的共
在编译带有一些标志的以下文件时,是否可以让 g++ 显示错误? #include using namespace std; int main() { int arr[ 2 ]; cout
在学习 Haskell 时,我遇到了一个挑战,要找到两个函数 f 和 g,例如 f g 和 f 。 g 是等价的(并且是总计,因此像 f = undefined 或 f = (.) f 这样的东西不算
根据我的理解,Theta 位于 Big O 和 Omega 之间,但我看到了这个声明,但我无法理解为什么交集会出现在这里。我能否对 Θ(g(n)) = O(g(n)) ∩ Ω(g(n)) 获得数学和分
我需要为这个递归函数编写一个迭代函数。 int funcRec(int n){ if(n>1) { return 2*funcRec(n - 1) + 3*funcRec(n
我在 github repository 上有代码示例并在 travis-ci 上创建了一个构建便于复制。 最小的、完整的和可验证的例子 可能不是最小的,但我相信它足够小 它使用 boost.inte
编辑:我们将调用箭头 p纯如果存在这样的函数f即:p = arr f . 我试图更好地掌握 Haskell 中的 Arrows,我想弄清楚什么时候 f >>> (g &&& h) = (f >>> g
我有两个(或更多)函数定义为: val functionM: String => Option[Int] = s => Some(s.length) val functionM2: Int => Op
好像是的。任何直观或严肃的证据都值得赞赏。 最佳答案 没有。 我认为您的问题等同于:给定函数 f 和 g,f 是 O(g) 或 g 是 O(f) 是否总是正确的?这在 SE Computer Scie
如果我设法证明 f(n) = o(g(n))(小 o),那么这两个函数的总和 f( n) + g(n) 应该被“更大”的函数 g(n) 紧紧束缚。 然而,我在证明这一点时遇到了一些麻烦。 最佳答案 以
我是一名优秀的程序员,十分优秀!