c ++在复制构造函数中调用函数

时间:2017-09-12 10:02:25

标签: c++ class

我目前有

public:
    LargerSetPartD(unsigned maxValue);
    LargerSetPartD(const LargerSetPartD &);  //copy constructor
    void printElements();               // prints members
    void set_union(const LargerSetPartD &);
    bool isMember(unsigned int);
private:
    unsigned long Values;
    unsigned maxElementValues;

在set_union中 我正在努力

LargerSetPartD *temparray = new LargerSetPartD(maxElementValue);
//this part of the code just saves an old array composed of Values to temparray.
if ( tempArray->isMember(i) || other.isMember(i))

然而,other.isMember(i)无效。我也尝试了其他 - > isMember(i),但这不起作用。我无法触摸/更改公共函数,因此我无法在成员中添加const。我不知道该怎么做。任何帮助,将不胜感激。我得到的错误信息是

passing ‘const LargerSetPartD’ as ‘this’ argument discards qualifiers [-fpermissive]

copy constructor:
LargerSetPartD::LargerSetPartD(const LargerSetPartD &other)
{

        Values = other.Values;
        maxElementValue = other.maxElementValue;
}

2 个答案:

答案 0 :(得分:0)

假设// INSTALL self.addEventListener('install', function(event) { console.log('[ServiceWorker] Installed version', version); event.waitUntil( caches.open(version).then(function(cache) { console.log('[ServiceWorker] Cached cachedFiles for', version); return cache.addAll(cacheFiles); }).then(function() { console.log('[ServiceWorker] Skip waiting on install'); return self.skipWaiting(); }) ); }); //ACTIVATE self.addEventListener('activate', function(event) { self.clients.matchAll({ includeUncontrolled: true }).then(function(clientList) { var urls = clientList.map(function(client) { return client.url; }); console.log('[ServiceWorker] Matching clients:', urls.join(', ')); }); event.waitUntil( caches.keys().then(function(cacheNames) { return Promise.all( cacheNames.map(function(cacheName) { if (cacheName !== version) { console.log('[ServiceWorker] Deleting old cache:', cacheName); return caches.delete(cacheName); } }) ); }).then(function() { console.log('[ServiceWorker] Claiming clients for version', version); return self.clients.claim(); }) ); }); //RECIEVE DATA FROM JAVASCRIPT FILE self.addEventListener('message', function(event){ console.log("SW Received Message: " + event.data); var fullArray = []; var che = event.data; fullArray = che.splice(','); console.log("SWChe2: " + fullArray); var result = fullArray.slice(1,-1); caches.open(version + 'Manifest') .then(function(cache) { return cache.addAll(result); }); }); other的{​​{1}}参数,您试图在const LargerSetPartD &对象上调用非set_union方法,而不是允许的。

由于您无法更改公共方法的签名,因此可以创建const的临时非常量副本并在其上调用该方法:

const

答案 1 :(得分:0)

  

我无法触及/更改公共功能...

这意味着你需要做一些黑客攻击并绕过编译器的检查。如果您被允许修改代码,则可以使用isMemberconst方法进行限定,如下所示:

public:
...
    bool isMember(unsigned int) const;

假设这是有效的(也就是说,假设isMember确实没有改变它所使用的对象,这在考虑方法名称的情况下是有意义的,你可以&# 34;假"这没有改变头文件。像这样使用const_cast

tempArray->isMember(i) // error

const_cast<LargerSetPartD*>(tempArray)->isMember(i) // OK

并且像这样:

other.isMember(i) // error

const_cast<LargerSetPartD&>(other.isMember(i)) // OK

但是,这会打开未来问题的代码(未定义的行为) - 编译器现在不会阻止您更改isMember方法中的内容。此外,代码看起来很丑陋。因此,最好在需要的地方添加const

此外,编译器为您提供了更强大(更危险)的替代方案:

  

... [-fpermissive]

如果将-fpermissive添加到编译命令行,编译器将忽略所有const限定符。这几乎肯定会隐藏危险的错误(你不想做),所以只有在绝对需要时才使用这种方法。