小编ira*_*ppa的帖子

C/C++链接约定

当调用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函数,所以这里处理这些不同的调用约定.

c c++ declspec

8
推荐指数
1
解决办法
490
查看次数

覆盖差异访问规范c ++

我在参加iKM考试时遇到了一个问题.有一个基类有两个带私有访问说明符的抽象方法.有一个派生类,它覆盖了这些抽象方法,但带有protected/public访问说明符.

我从未遇到过派生类中重写方法具有不同访问规范的事情.这是允许的吗?如果是,它是否符合基础和派生(即安全可替代)之间的"IS A"关系.

你能否指点一些参考文献,可以提供关于这类课程用法的更多细节?

谢谢.

c++

7
推荐指数
1
解决办法
3168
查看次数

析构函数查询

我有这个下面的程序,我通过引用函数传递一个向量myFunc,在这个函数里面,我向向量添加了一些元素.

我没有释放用new创建对象,现在忽略由此引起的内存泄漏.

myFunc()执行完成我打印变量构造函数和析构函数知道多少次的构造函数和析构函数是如何调用.

输出是:

Before Exiting 5 7
Run Code Online (Sandbox Code Playgroud)

我创建了5个对象,以便ctor5.但为什么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)

c++

6
推荐指数
1
解决办法
204
查看次数

使用reintepret_cast解释对象地址

下面的代码给出输出为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)

c++ casting

5
推荐指数
1
解决办法
194
查看次数

单个虚拟继承

我知道基类的虚拟继承在多个派生类之间创建了一个公共共享基类,从而解决了DDD问题.如果我的基类只有一个派生类,那么当我虚拟地或非虚拟地继承基础时会有区别吗?基本上我试图理解查询中提供的解释是否有可能禁止在编译时从类派生?其中,Usage_lock基类是虚拟继承的,以防止从类Usable派生.如果我删除此虚拟键,行为会更改,即我可以从Usable派生子类.所以我想了解单继承场景中虚拟键的差异原因.

c++ virtual-inheritance

4
推荐指数
1
解决办法
752
查看次数

互换使用函数和函子 - C++

对于copy_ifcount_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)

c++ stl

3
推荐指数
1
解决办法
65
查看次数

C++ vtable查询

我对此处提供的解释有疑问http://www.parashift.com/c++-faq/virtual-functions.html#faq-20.4

在示例代码中的函数mycode(Base *p),调用virt3方法为p->virt3().在这里,编译器如何知道virt3是在第三个插槽中找到的vtable?它如何与之比较?

c++

2
推荐指数
1
解决办法
369
查看次数

没有锁的同步

我正在考虑使用以下机制来同步两个/多个线程.我认为唯一的缺点是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)

c c++ multithreading gcc

2
推荐指数
1
解决办法
510
查看次数

在C++中访问嵌套类

我在一个在线测试中遇到了这个问题.任务是改变这个程序以摆脱编译错误.

#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’

我怎么做对了?我尝试了一些但无法解决这些错误.

c++

1
推荐指数
1
解决办法
132
查看次数

为什么ostream的put指针被修改,即使我没有使用ostream对象

我的程序中有以下代码.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指针改变?

c++

-1
推荐指数
1
解决办法
91
查看次数

标签 统计

c++ ×10

c ×2

casting ×1

declspec ×1

gcc ×1

multithreading ×1

stl ×1

virtual-inheritance ×1