当调用C++算法(如copy_if,transform等,它们将一元或二元函数作为最后一个参数)时,我可以传递一个像atoi或tolower这样的C库函数.
例如,以下调用工作正常并给出正确的输出(在ideone中尝试)
1) transform (foo, foo+5, bar, atoi);
2) transform (foo, foo+5, bar, ptr_fun(atoi));
3) transform(s.begin(),s.end(),s.begin(), static_cast<int (*)(int)>(tolower));
Run Code Online (Sandbox Code Playgroud)
这种用法是否可以保证适用于所有C++编译器?
用C++思考的这本书提到"这适用于一些编译器,但并不是必须的." 提到的原因是(据我所知),转换是C++函数,并期望它的最后一个参数具有相同的调用约定.
本书还提出了解决此问题的方法,即在单独的cpp文件中创建这样的包装函数,并且不包含iostreams头文件.
// tolower_wrapper.cpp
string strTolower(string s) {
transform(s.begin(), s.end(), s.begin(), tolower);
return s;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我不明白这是如何解决调用约定问题的?transform仍然是一个c ++函数,而tolower仍然是strTolower中的一个C函数,所以这里处理这些不同的调用约定.
我在参加iKM考试时遇到了一个问题.有一个基类有两个带私有访问说明符的抽象方法.有一个派生类,它覆盖了这些抽象方法,但带有protected/public访问说明符.
我从未遇到过派生类中重写方法具有不同访问规范的事情.这是允许的吗?如果是,它是否符合基础和派生(即安全可替代)之间的"IS A"关系.
你能否指点一些参考文献,可以提供关于这类课程用法的更多细节?
谢谢.
我有这个下面的程序,我通过引用函数传递一个向量myFunc
,在这个函数里面,我向向量添加了一些元素.
我没有释放用new创建对象,现在忽略由此引起的内存泄漏.
后myFunc()
执行完成我打印变量构造函数和析构函数知道多少次的构造函数和析构函数是如何调用.
输出是:
Before Exiting 5 7
Run Code Online (Sandbox Code Playgroud)
我创建了5个对象,以便ctor
为5
.但为什么dtor
7
呢?额外的两个计数从何而来?我错过了什么吗?
#include
#include
using namespace std;
static int ctor = 0;
static int dtor = 0;
class MyClass
{
public:
MyClass(int n)
{
i = n;
ctor++;
// cout << "Myclass ctor " << ctor << endl;
}
~MyClass()
{
dtor++;
// cout << "Myclass dtor" << dtor << endl;
}
private:
int i;
};
void myFunc(vector<MyClass> &m);
void myFunc(vector<MyClass> &m) …
Run Code Online (Sandbox Code Playgroud) 下面的代码给出输出为136.但我无法理解前两个地址比较是如何相等的.感谢任何帮助以理解这一点.谢谢.
#include <iostream>
class A
{
public:
A() : m_i(0){ }
protected:
int m_i;
};
class B
{
public:
B() : m_d(0.0) { }
protected:
double m_d;
};
class C : public A, public B
{
public:
C() : m_c('a') { }
private:
char m_c;
};
int main( )
{
C d;
A *b1 = &d;
B *b2 = &d;
const int a = (reinterpret_cast<char *>(b1) == reinterpret_cast<char *>(&d)) ? 1 : 2;
const int b = (b2 == &d) …
Run Code Online (Sandbox Code Playgroud) 我知道基类的虚拟继承在多个派生类之间创建了一个公共共享基类,从而解决了DDD问题.如果我的基类只有一个派生类,那么当我虚拟地或非虚拟地继承基础时会有区别吗?基本上我试图理解查询中提供的解释是否有可能禁止在编译时从类派生?其中,Usage_lock基类是虚拟继承的,以防止从类Usable派生.如果我删除此虚拟键,行为会更改,即我可以从Usable派生子类.所以我想了解单继承场景中虚拟键的差异原因.
对于copy_if
、count_if
和许多其他算法,我可以在需要谓词的地方互换使用函数或函子。
但是std::set
,对于 ,我无法传递函数来代替它所采用的比较函数参数。在这种情况下我必须传递一个函子。为什么它不接受函数?
bool myfunction (int lhs, int rhs) {
cout << "myfunction\n";
return true;
}
struct myfunctor {
bool operator() (const int& lhs, const int& rhs) const {
cout << "myfunctor\n";
return true;
}
};
std::set<int,myfunctor> first;
std::set<int,myfunction> second; // this does not compile.
Run Code Online (Sandbox Code Playgroud) 我对此处提供的解释有疑问http://www.parashift.com/c++-faq/virtual-functions.html#faq-20.4
在示例代码中的函数mycode(Base *p)
,调用virt3
方法为p->virt3()
.在这里,编译器如何知道virt3是在第三个插槽中找到的vtable
?它如何与之比较?
我正在考虑使用以下机制来同步两个/多个线程.我认为唯一的缺点是CPU使用率.请分享您对此机制的意见.这个实现有问题吗?(假设gcc的_ sync*函数是可移植的)
//logic is that if lock = 1 means a thread has acquired the lock.
// lock = 0 means lock is free.
// acquireLock:
// add 1 to lock if value is 1 this thread gets the lock
// if value is > 1 mean some one else have taken the lock, so decrement the count
int lock = 0 ; // global variable.
void acquireLock()
{
while(__sync_add_and_fetch (&lock,1) > 1)
{
__sync_add_and_fetch (&lock,-1);
}
}
void …
Run Code Online (Sandbox Code Playgroud) 我在一个在线测试中遇到了这个问题.任务是改变这个程序以摆脱编译错误.
#include<iostream>
#include<iomanip>
class Vehicle
{
public:
static Car* createCar()
{
return new Car;
}
class Car
{
public:
string name;
};
private:
int seats;
};
void useVehicle()
{
Vehicle::Car *c = Vehicle::createCar();
c->name = "BMW";
}
int main(int argc, char *argv[])
{
useVehicle();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译错误如下:
error: ‘Car’ does not name a type
error: ‘string’ does not name a type
在功能中void useVehicle()
:
error: ‘createCar’ is not a member of ‘Vehicle’
我怎么做对了?我尝试了一些但无法解决这些错误.
我的程序中有以下代码.IoFile.out几行.
int main()
{
ifstream inFile("Iofile.out", ios::in|ios::out);
ostream outStream(inFile.rdbuf());
cout << "tellp outStream " << outStream.tellp() << endl; // tellp outStream 0
cout << "tellg inFile " << inFile.tellg() << endl; // tellg inFile 0
cout << inFile.rdbuf(); // Print whole file
cout << "tellp outStream " << outStream.tellp() << endl; // tellp outStream 21
cout << "tellg inFile " << inFile.tellg() << endl; // tellg inFile 21
return 0;
}
Run Code Online (Sandbox Code Playgroud)
tellp和tellg的输出如注释中所示.我的查询是当我将文件内容写入cout时,我希望只有streambuf的读指针(即tellg)移动到文件的末尾.但在这种情况下,我看到outStream的put指针也被移动到文件末尾.为什么是这样 ?为什么要将文件打印到cout导致outStream的put指针改变?