unique_ptr在linux找不到标识符

在windows下这样写这样代码ok:
#include (memory)
using namespace std ;
unique_ptr(ClassName>)p (new ClassName())

但在linux下就报错说unique_ptr找不到标识符,这是为什么啊
(尖括号显示不出来,用普通括号替代,大家应该懂的)

8个回答

是不是编译方式的问题!
尝试:
g++ main.cpp -o app -std=c++11

qq_33707711
Mr-Luer 正解
一年多之前 回复

上面#include貌似显示不出来

littlejade1214
毛线一团 我也认为上面#include后面跟的应该是一个原创的头文件
一年多之前 回复

unique_ptr
unique_ptr是一种定义在中的智能指针(smart pointer)。

它持有对对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。

简介
unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:

unique_ptr指向的对象被破坏

对象通过operator=()或reset()被指定到另一个指针)

unique_ptr还可能没有对象,这种情况被称为empty。

例如:

std::unique_ptrp1(new int(5));

std::unique_ptrp2=p1;// 编译会出错

std::unique_ptrp3=std::move(p1);// 转移所有权, 现在那块内存归p3所有, p1成为无效的针.

p3.reset();//释放内存.

p1.reset();//无效

使用
unique_ptr的功能

不管是正常退出还是异常退出,均可通过保证删除为处理拥有动态寿命的类和函数提供额外的保护;

将独有的持有动态寿命对象传递给函数;

从函数获取持有动态寿命对象的所有权

所有auto_ptr应该已经具有的功能

概要
unique_ptr十分依赖于右值引用和移动语义。

下面是一段传统的会产生不安全的异常的代码:

X* f() { X* p =new X; // 做一些事情 – 可能会抛出某个异常 return p; }

解决方法是,用一个unique_ptr 来管理这个对象的所有权,由其进行这个对象的删除释放工作:

X* f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X // 做一些事情 – 可能会抛出异常return p.release(); }

现在,如果程序执行过程中抛出了异常,unique_ptr就会(毫无疑问地)删除释放它所指向的对象,这是最基本的RAII。但是,除非我们真的需要返回一个内建的指针,我们可以返回一个unique_ptr,让事情变得更好。

unique_ptr f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X //做一些事情 – 可能会抛出异常return p; // 对象的所有权被传递出f() }

现在我们可以这样使用函数f():

void g() { unique_ptr q = f(); // 使用移动构造函数(move constructor) q->memfct(2); // 使用q X x = *q; // 复制指针q所指向的对象 // … } // 在函数退出的时候,q以及它所指向的对象都被删除释放

unique_ptr拥有“移动意义(move semantics)”,所以我们可以使用函数f() 返回的右值对q进行初始化,这样就简单地将所有权传递给了q。

  在那些要不是为了避免不安全的异常问题(以及为了保证指针所指向的对象都被正确地删除释放),我们不可以使用内建指针的情况下,我们可以在容器中保存unique_ptr以代替内建指针:

vector

  对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们需要时刻记得释放,且不能重复释放,释放后不能再去使用... 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了,智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放,对动态内存做到一个比较好的管理

  unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作

  unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

littlejade1214
毛线一团 看了一眼stackoverflow上面的讨论,unique_ptr::operator*()可以做自定义删除器的重载。
一年多之前 回复

对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们需要时刻记得释放,且不能重复释放,释放后不能再去使用... 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了,智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放,对动态内存做到一个比较好的管理
  unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作
  unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

在标准C++以前,都是用#include这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include 。
并不是写了#include就必须用using namespace std;我们通常这样的写的原因是为了一下子把std名字空间的东东全部暴露到全局域中(就像是直接包含了iostream.h这种没有名字空间的头文件一样),使标准C++库用起来与传统的iostream.h一样方便。如果不用using namespace std;使用标准库时就得时时带上名字空间的全名,如std::cout << "hello" << std::endl;
#include "iostream"与#include的区别:前者先在当前目录找iostream文件,找不到再去系统头文件路径找,后者反之。因此,做为一个良好的习惯,在包含系统头文件时尽量用<>,而在包含自己的工程中的头文件时用""。
和不一样,前者没有后缀,实际上,在编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因此,当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
#include
using namespace std; 则出错

  unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作

  unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

上面#include貌似显示不出来,问题出现在这

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
对unique_ptr与shared_ptr为nullptr时, 删除器的调用机制疑惑
先贴上代码: ``` #include <memory> #include <iostream> auto unique_deleter = [](int* p) { std::cout << "unique_ptr delete:" << *p << "\n"; delete p; }; auto shared_deleter = [](int* p) { std::cout << "shared_ptr delete:" << *p << "\n"; delete p; }; auto shared_deleter_check_nullptr = [](int* p) { if (p != nullptr) { std::cout << "shared_ptr2 delete:" << *p << "\n"; delete p; } else { std::cout << "shared_ptr2 is null\n"; } }; int main() { { // unique_ptr == nullptr, 删除器没有被调用 std::unique_ptr<int, decltype(unique_deleter)> pUniquePtr(nullptr, unique_deleter); // unique_ptr != nullptr, 删除器被调用 std::unique_ptr<int, decltype(unique_deleter)> pUniquePtr2(new int(5), unique_deleter); // shared_ptr == nullptr, 删除器仍然被调用, 幸好对"nullptr"有检查 std::shared_ptr<int> pSharedPtr(nullptr, shared_deleter_check_nullptr); // shared_ptr != nullptr, 删除器被调用 std::shared_ptr<int> pSharedPtr2(new int(10), shared_deleter); // shared_ptr == nullptr, 删除器仍然被调用, 没有对"nullptr"的检查, 程序崩溃 //std::shared_ptr<int> pSharedPtr(nullptr, shared_deleter); } getchar(); } ``` 测试环境: win10 64bit g++4.9.2 --std=c++1y 通过测试发现, 当std::unique_ptr为nullptr时, 自定义删除器不会被调用, 而std::shared_ptr为nullptr时, 自定义删除器仍然会被调用, 这就要求, 当定义ared_ptr的删除器时, 需要对is nullptr作检查, 而unique_ptr就不需要, Why? Why? Why?
boost shared_ptr使用问题求解。
已经对照 http://blog.csdn.net/huang_xw/article/details/8549444 解决了部分使用shared_ptr()的疑惑。 现有代码如下: 1,CGameSession* pgamesession = new CGameSession(this); 2,shared_ptr<CGameSession> gamesession(pgamesession); 3,if (gamesession._Get() != pgamesession) { BOOST_ASSERT(gamesession._Get() != pgamesession); } 4,GetNetSevice()->postConnectService(strIP.c_str(), port, pgamesession); 其中postConnectService最后一个参数要求使用CGameSession*类型参数。 在本范例中,如果按图中的顺序调用,则在函数内使用pgamesession调用他的成员函数时会报错。 然后,我只要去掉2,3句。也就是不经过shared_ptr的一次赋值,则不会出现任何问题,.那么各位爷应该明白了,我查看内存并没有发现经过shared_ptr赋值后pgamesession的内存有变化。那么这个问题到底是为何呢? //////////////////////////////////////补充一下 问题定位, 在postConnectService有这么一段代码。 5,m_pHandler = pHandler; //转换一次ip地址 6, boost::asio::ip::address address; address = address.from_string(ip); tcp::endpoint endpoint(address, port); 7,m_pSocket->async_connect(endpoint, boost::bind(&CTCPClient::handle_connect, this, boost::asio::placeholders::error)); 其中5中被赋值的pHandler就是外部的pgamesession。 在执行第7句之前,一切正常。 当执行玩第7句,进入异步函数CTCPClient::handle_connect时。 m_pHandler的虚表丢失了。所以导致通过m_pHandler(也就是pgamesession) 调用的重载函数都无法访问了。 但是小弟愚昧,实在没有参透各中原因。
Linux编译mysql8.0.15报错,求大神
/usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在函数‘Json_dom_ptr merge_doms(Json_dom_ptr, Json_dom_ptr)’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:112:12: 错误:无法将左值‘Json_object_ptr {aka std::unique_ptr<Json_object>}’绑定到‘std::unique_ptr<Json_object>&&’ return left_object; ^ In file included from /usr/local/include/c++/4.8.4/memory:81:0, from /usr/local/src/mysql-8.0.15/sql/json_dom.h:29, from /usr/local/src/mysql-8.0.15/sql/json_dom.cc:23: /usr/local/include/c++/4.8.4/bits/unique_ptr.h:169:2: 错误:以初始化‘std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Up = Json_object; _Ep = std::default_delete<Json_object>; <template-parameter-2-3> = void; _Tp = Json_dom; _Dp = std::default_delete<Json_dom>]的实参 1 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc:125:10: 错误:无法将左值‘Json_array_ptr {aka std::unique_ptr<Json_array>}’绑定到‘std::unique_ptr<Json_array>&&’ return left_array; ^ In file included from /usr/local/include/c++/4.8.4/memory:81:0, from /usr/local/src/mysql-8.0.15/sql/json_dom.h:29, from /usr/local/src/mysql-8.0.15/sql/json_dom.cc:23: /usr/local/include/c++/4.8.4/bits/unique_ptr.h:169:2: 错误:以初始化‘std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Up = Json_array; _Ep = std::default_delete<Json_array>; <template-parameter-2-3> = void; _Tp = Json_dom; _Dp = std::default_delete<Json_dom>]’实参 1 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在成员函数‘virtual Json_dom_ptr Json_object::clone() const’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:1010:10: 错误:无法将左值‘Json_object_ptr {aka std::unique_ptr<Json_object>}’绑定到‘std::unique_ptr<Json_object>&&’ return o; ^ In file included from /usr/local/include/c++/4.8.4/memory:81:0, from /usr/local/src/mysql-8.0.15/sql/json_dom.h:29, from /usr/local/src/mysql-8.0.15/sql/json_dom.cc:23: /usr/local/include/c++/4.8.4/bits/unique_ptr.h:169:2: 错误:以初始化‘std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Up = Json_object; _Ep = std::default_delete<Json_object>; <template-parameter-2-3> = void; _Tp = Json_dom; _Dp = std::default_delete<Json_dom>]的实参 1 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在成员函数‘virtual Json_dom_ptr Json_array::clone() const’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:1150:10: 错误:无法将左值‘Json_array_ptr {aka std::unique_ptr<Json_array>}’绑定到‘std::unique_ptr<Json_array>&&’ return vv; ^ In file included from /usr/local/include/c++/4.8.4/memory:81:0, from /usr/local/src/mysql-8.0.15/sql/json_dom.h:29, from /usr/local/src/mysql-8.0.15/sql/json_dom.cc:23: /usr/local/include/c++/4.8.4/bits/unique_ptr.h:169:2: 错误:以初始化‘std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Up = Json_array; _Ep = std::default_delete<Json_array>; <template-parameter-2-3> = void; _Tp = Json_dom; _Dp = std::default_delete<Json_dom>]’实参 1 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在函数‘Json_dom_ptr merge_doms(Json_dom_ptr, Json_dom_ptr)’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:127:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type] } ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在成员函数‘virtual Json_dom_ptr Json_object::clone() const’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:1012:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type] } ^ /usr/local/src/mysql-8.0.15/sql/json_dom.cc: 在成员函数‘virtual Json_dom_ptr Json_array::clone() const’中: /usr/local/src/mysql-8.0.15/sql/json_dom.cc:1152:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type] } ^ make[2]: *** [sql/CMakeFiles/sql_main.dir/json_dom.cc.o] 错误 1 make[1]: *** [sql/CMakeFiles/sql_main.dir/all] 错误 2 make: *** [all] 错误 2
关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ?
在堆上的对象作为一个类的一个成员变量,我了解到的至少有三种方式(如下所示): class A { } class B { A* m_pA1; auto_ptr<A> m_pA2; shared_ptr<A> m_pA3; } B::B() :m_pA1(new A),m_pA2(auto_ptr<A>(new A)),m_pA3(shared_ptr<A>(new A)) { } 针对这三种方案,在什么情况下选择哪种呢:下面是小弟的一些感悟,算是抛砖引玉 1、个人感觉和B的拷贝构造和赋值有关系,如果需要的是B的一个深拷贝,我会选择m_pA1; 2、auto_ptr<A>的所有权剥夺性,使得他不适合拷贝构造和赋值; 3、shared_ptr<A>采用引用计数 觉得和m_pA1之间做选择还是有点纠结? 4、圆方,你怎么看?
g++ 4.7 如果不使用c++11的标准不能使用shared_ptr吗?
RT 在g++4.7的版本中如果编译时不指定-std=c++11 则不能识别shared_ptr吗? #include <iostream> #include <memory.h> using namespace std; int main() { shared_ptr< int > p = NULL; //编译不过啊 }
关于C++ share_ptr构造函数的问题
我想问一下,为什么第二句语句这么写是不可以的, 如果想要自己实现这样的类,来阻止=的构造函数该怎么做 ``` shared_ptr<int> pint(new int(5)); shared_ptr<int> pins = new int(5); ```
boost::thread_specific_ptr<std::string> m_name 编译时无法解析的外部符号
最近项目上需要做软件日志输出,头文件中声明了 class Logger { private: Logger(); ~Logger(); private: boost::thread_specific_ptr <std::string> m_name; boost::thread_specific_ptr <Logger> m_logger; } 但是在编译时报错,无法解析的外部符号。 为什么会这样报错呢? 无法解析的外部符号是什么意思以及为什么会出现这种情况?
这个 shared_ptr 在使用的时候为什么要 reset?
``` class Query_result; class Text_query { public: using line_no = vector<std::string>::size_type; Text_query(ifstream&); Query_result query(const string&) const; private: shared_ptr<vector<string>> file; map<string, shared_ptr<set<line_no>>> wm;//这里 }; Text_query::Text_query(ifstream &is) : file(new vector<string>) { string text; while (getline(is, text)) { file->push_back(text); int n = file->size() - 1; istringstream line(text); string word; while (line >> word) { auto &lines = wm[word]; if (!lines) lines.reset(new set <line_no>);//这里 lines->insert(n); } } } ``` 《C++ Primer》第五版,中文版。 433 页。书上的解释看不明白。
shared_ptr reset 疑问
做了个小实验,代码如下: ``` int main() { int* p = new int(100); shared_ptr<int> p1(p); shared_ptr<int> p2 = p1; cout<<"p1 引用数(1):"<<p1.use_count()<<endl; // 打印2 p1.reset(); cout<<"p1 引用数(2):"<<p1.use_count()<<endl; // reset了一次之后就打印0了,为什么会是0,如果是0, p应该被释放了才对啊 cout<<*p<<endl; // 打印 100 system("pause"); return 0; } ``` 望有大神给我解惑
c++ boost offset_ptr问题求教
哪位大神对boost比较了解的 声明了 struct ST_ROW { offset_ptr<char> szRow; }; 想要把szRow指向一个字符串,怎么做
str::shared_ptr要的是原始指针,这个原始指针是什么意思
str::shared_ptr要的是原始指针,这个原始指针是什么意思
vp(5)不是输出5个数么?怎么是6个数?
``` #include<iostream> using namespace std; #include<memory> #include<vector> #include<cstdlib> #include<algorithm> unique_ptr<int> make_int(int n) { return unique_ptr<int>(new int(n)); } void show(unique_ptr<int>& pi) { cout<<*pi<<' '; } int main() { vector<unique_ptr<int>> vp(5); /*这里是5,为什么会输出6个数?*/ for (int i=0;i<vp.size();i++) vp[i]=make_int(rand()%1000); vp.push_back(make_int(rand()%1000)); for_each (vp.begin(),vp.end(),show); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201609/19/1474265855_67862.png)
C++ 复制链表从一个节点到另一个节点
我要复制一个链表_ void list_piece(const node* start_ptr, const node* end_ptr, node*& head_ptr, node*& tail_ptr) start_ptr 和end_ptr 不是NULL head_ptr tail_ptr 是新链表的头指针和尾指针,新链表包含从start_ptr 到end_ptr的数据项(不包含end_ptr) 求思路和代码,怎么能在end_ptr 节点复制的时候停下来呢
C++11程序智能指针改写问题
程序中用了C++11中的智能指针,例如shared_ptr或者是unique_ptr,可以将程序改写为较低标准比如C++98版本的函数吗?该怎么改写呢?
关于二叉树动物问答数据,如何使用文件来构造出二叉树?
课程设计要求使用出文件能够记录住自己的二叉树,但自己在实现的时候有一些问题。 ``` #include<iostream> #include<cstdlib> #include<string> #include<fstream> #include<stack> #include"bintree.h" #include"useful.h" using namespace std; void ask_and_move(binary_tree_node<string>*& current_ptr); binary_tree_node<string>* beginning_tree(); void instruct(); void learn(binary_tree_node<string>*& leaf_ptr); void play(binary_tree_node<string>* current_ptr); void WriteHelp(binary_tree_node<string> *root,ofstream &outFile); bool IsQuestion(string s); void CreateHelp(binary_tree_node<string> *root,ifstream &inFile); ofstream of; ifstream if1; int main() { binary_tree_node<string>* animal_root_ptr; instruct(); animal_root_ptr = beginning_tree(); do play(animal_root_ptr); while (again("还要不要再玩一次?")); cout << "欢迎下次来玩~" << endl; //写入文件animal。dat中 of.open("E://game.dat",ios::out); WriteHelp(animal_root_ptr,of); return 0; } void instruct() { cout << "现在开始游戏吧" << endl; cout << "你脑海中想象一只动物,让我来猜一猜" << endl; } void ask_and_move(binary_tree_node<string>*& current_ptr) { cout << current_ptr->data();//输出问题 if (again("请回答:")) { current_ptr = current_ptr->left(); } else current_ptr = current_ptr->right(); } //创建二叉树 binary_tree_node<string>* beginning_tree(){ ifstream inFile("E://game.dat"); binary_tree_node<string>* root_ptr;//头节点指针 binary_tree_node<string>* child_ptr;//孩子节点指针 if(inFile==NULL) { cout<<"未找到已有的二叉树,构建默认的二叉树"<<endl; const string root_question("是哺乳动物吗?"); const string left_question("比猫大吗?"); const string right_question("在水里吗?"); //加问题 const string animal_1("袋鼠"); const string animal_2("老鼠"); const string animal_3("鱼"); const string animal_4("喜鹊"); //加动物 //根节点 root_ptr = new binary_tree_node<string>(root_question);//头节点指针指向新创建的节点问题 //左子树 child_ptr = new binary_tree_node<string>(left_question);//左孩子问题 child_ptr->set_left(new binary_tree_node<string>(animal_1)); child_ptr->set_right(new binary_tree_node<string>(animal_2)); root_ptr->set_left(child_ptr);//将根节点的左节点设置为子节点的左节点 //右子树 child_ptr = new binary_tree_node<string>(right_question); child_ptr->set_left(new binary_tree_node<string>(animal_3)); child_ptr->set_right(new binary_tree_node<string>(animal_4)); root_ptr->set_right(child_ptr);//将根节点的右节点设置为子节点的右节点 return root_ptr; } else { binary_tree_node<string>* root_ptr;//头节点指针 if1.open("E://game.dat",ios::in); CreateHelp(root_ptr,if1); if1.close(); return root_ptr; } } void learn(binary_tree_node<string>*& leaf_ptr) {//改成用文件 string guess_animal; string correct_animal; string new_question; guess_animal = leaf_ptr->data(); cout << "好吧,我不知道是什么,还是你告诉我吧?" << endl; getline(cin, correct_animal); cout << "现在请输入一个新的问题来区分 "; cout <<'['<<correct_animal<<']'<< " 和 " << '['<<guess_animal<<']' << endl; getline(cin, new_question); leaf_ptr->set_data(new_question); cout<<correct_animal << "," << new_question << endl; if (again("请回答")) {//如果回答的是正确的则做节点 leaf_ptr->set_left(new binary_tree_node<string>(correct_animal)); leaf_ptr->set_right(new binary_tree_node<string>(guess_animal)); } else { leaf_ptr->set_left(new binary_tree_node<string>(guess_animal)); leaf_ptr->set_right(new binary_tree_node<string>(correct_animal)); } } void play(binary_tree_node<string>* current_ptr) { cout << "按下回车开始游戏"; eat_line();//等待,直到按下回车 while (!current_ptr->is_leaf())//如果不是叶子节点就执行ask_and_remove()函数,因为是叶子节点就直接输出最后猜测的结果 ask_and_move(current_ptr); cout << ("是" + current_ptr->data()+"吧"); if (!again(",我猜对了吗?"))//询问是否猜对,否,将该动物添加到二叉树中 learn(current_ptr); else cout << "我猜对了,哈哈哈哈" << endl; } void WriteHelp(binary_tree_node<string> *root,ofstream &outFile) { if(root!=NULL) { outFile<<root->data()<<endl; WriteHelp(root->left(),outFile); WriteHelp(root->right(),outFile); } } void CreateHelp(binary_tree_node<string> *root,ifstream &inFile) { string s; inFile>>s; if(!IsQuestion(s)) { cout<<"123123"; root->set_data(s); return ; } cout<<"Aasd"; root = new binary_tree_node<string>(s); CreateHelp(root->left(),inFile); CreateHelp(root->right(),inFile); } bool IsQuestion(string s) { int a = s.find("?"); int b = s.find("?"); if(a==-1&&b==-1) return 0; else return 1; } ``` template<class Item> class binary_tree_node { public: typedef Item value_type; binary_tree_node(const Item& init_data = Item(), binary_tree_node* init_left = NULL, binary_tree_node* init_right = NULL) { data_field = init_data; left_field = init_left; right_field = init_right; } Item data() { return data_field; } binary_tree_node* left() { return left_field; } binary_tree_node* right() { return right_field; } void set_data(Item new_data) { data_field = new_data; } void set_left(binary_tree_node* new_left) { left_field = new_left; } void set_right(binary_tree_node* new_right) { right_field = new_right; } bool is_leaf() { return (left_field == NULL) && (right_field == NULL); } private: Item data_field; binary_tree_node* left_field; binary_tree_node* right_field; }; ``` #include<assert.h> #include<ctype.h> #include<iostream> #include<stdlib.h> using namespace std; void eat_line() { char next; do cin.get(next);//一直等待,直到按下回车 while (next!='\n'); } //传入一个数组 bool again(const char query[]) { char answer; do { cout << query << "[Yes or No]" << endl; cin >> answer; answer = toupper(answer);//这个表示变成大写 eat_line(); } while ((answer != 'Y') && (answer != 'N'));//如果输入的不是yes/no就继续询问 return (answer == 'Y');//返回输入的是否为yes,是返回true否则返回false } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/18/1576644860_28372.png) 如果没有建立文件的话,是没有使用上的问题的 ![图片说明](https://img-ask.csdn.net/upload/201912/18/1576644906_6502.png) 但是在建立后,我设置了一些输出试图找出问题出现在哪里,但还是找不出问题所在。
VS2010报错 无法从“void (__cdecl CMainFrame::* )(UINT)”转换为“void (__cdecl CWnd::* )(UINT_PTR)"
VS2010编译报错 如图,我试过把类型改了过来还是有问题 该怎么解决? 有时候代码用的好好的,突然就出现这个问题了![图片说明](https://img-ask.csdn.net/upload/201904/16/1555396622_614685.jpg)![图片说明](https://img-ask.csdn.net/upload/201904/17/1555463676_376295.png)![图片说明](https://img-ask.csdn.net/upload/201904/17/1555463682_172129.png)我把OnTimer的类型改成UINT_PTR,然后就报错LNK 1561 必须定义入口点,这怎么回事啊
thrift使用TThreadPoolServer时出现undefined
thrift使用时编译服务端出现了TThreadPoolServer的构造问题,这里无故出现的boost::shared_ptr类型问题,在之前编译过程中一直没有出现问题,直到重新编译thrift之后才出现类似问题 undefined reference to `apache::thrift::server::TThreadPoolServer::TThreadPoolServer(boost::shared_ptr<apache::thrift::TProcessor> const&, boost::shared_ptr<apache::thrift::transport::TServerTransport> const&, boost::shared_ptr<apache::thrift::transport::TTransportFactory> const&, boost::shared_ptr<apache::thrift::protocol::TProtocolFactory> const&, boost::shared_ptr<apache::thrift::concurrency::ThreadManager> const&)' undefined reference to `apache::thrift::concurrency::PosixThreadFactory::newThread(boost::shared_ptr<apache::thrift::concurrency::Runnable>) const'
为什么c程序传入一个未初始化的指针给函数会导致程序崩溃,而传未初始化指针的地址给函数却不会呢?
比如: typedef char* Elem_ptr 1、导致崩溃的情况 void Function(Elem_ptr c,int n){_ c = (Elem_ptr)malloc(n*sizeof(char)); } //主函数 Elem_ptr s;int i;Function(s,i); 2、不会导致崩溃的情况 void Function(Elem_ptr *c,int n){ (*c) = (Elem_ptr)malloc(n*sizeof(char)); } //主函数 Elem_ptr s;int i;Function(&s,i);
ERROR:shared_ptr does not name a type
![代码如图:第27行报错图片说明](https://img-ask.csdn.net/upload/201507/02/1435840317_328997.png) ![报错如图图片说明](https://img-ask.csdn.net/upload/201507/02/1435840376_730277.png) 求大神解答
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问