- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在尝试使用模板在 C++ 中实现链表。不幸的是,当我尝试使用 ostream 时遇到 Unresolved external 错误。本站类似问题的解答说是头文件和.cpp文件不匹配,我觉得这里不是。谁能帮我解决这个问题,我真的需要掌握这一点。
链表.h:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <string>
#include <iostream>
template<class T> class LinkedList;
// Class representing a templated linkedlist element
template<class T> class LLElement {
friend class LinkedList<T>;
public:
// Constructor
LLElement(T* p_Data) : data(p_Data), next(NULL) {}
T* getData() const { return data; }
LLElement<T>* getNext() { return next; }
private:
LLElement<T>* next;
T* data;
};
// Class representing a templated linked list
template<class T> class LinkedList {
public:
LinkedList() : size(0), start(NULL) {}
LinkedList(const LinkedList&);
~LinkedList();
unsigned int getSize() const { return size; }
LLElement<T>* getStart() const { return start; }
//adds shallow copy of T to the LinkedList
void sortedAdd(T*);
//removes the first occurence of T from the LinkedList
void remove(T*);
//merges existing LinkedList with given LinkedList
void merge(const LinkedList<T>&);
//formatted print of LinkedList to given outputstream
void showLinkedList(std::ostream& p_Out) const;
friend std::ostream& operator<<(std::ostream& outputStream, const LinkedList<T>& sec);
private:
LLElement<T>* start;
unsigned int size;
};
//LinkedList copy constructor
//TODO
template<class T> LinkedList<T>::LinkedList(const LinkedList<T>& a){
this->size=a.getSize();
this->start=a.getStart();
}
// LinkedList destructor
// TODO
template<class T> LinkedList<T>::~LinkedList(){
LLElement<T>* a=this->getStart();
LLElement<T>* b=a->next;
while(a!=NULL){
delete a;
a=b;
b=a->next;
}
}
// sortedAdd
// adds shallow copy of T to the LinkedList
// TODO
template<class T> void LinkedList<T>::sortedAdd(T* add){
LLElement<T>* a=new LLElement<T>(add);
LLElement<T>* b=this->getStart();
while(!(*(b->data)<=*(a->getData()))){
b=b->next;
}
a->next=b->next;
b->next=a;
this->size++;
}
// remove
// removes the first occurence of T from the LinkedList
// TODO
template<class T> void LinkedList<T>::remove(T* ab){
LLElement<T>* a=this->getStart();
LLElement<T>* b=this->getStart();
while(a!=NULL){
if(*(a->data)==*(ab)){
if(b==a){
this->start=a->next;
delete a;
this->size--;
return;
}
b->next=a->next;
delete a;
this->size--;
return;
}
b=a;
a=b->getNext();
}
}
// TODO output operator
template<class T> std::ostream& operator<<(std::ostream& outputStream, const LinkedList<T>& sec){
sec.showLinkedList(outputStream);
return outputStream;
}
//merges existing LinkedList with given LinkedList
template<class T> void LinkedList<T>::merge(const LinkedList<T>& p_LL){
LLElement<T> *cursor = p_LL.start;
while (cursor != NULL){
sortedAdd(cursor->data);
cursor = cursor->next;
}
}
//formatted print of LinkedList to given outputstream
template<class T> void LinkedList<T>::showLinkedList(std::ostream& p_Out) const {
LLElement<T>* current = start;
int counter = 1;
p_Out << "LINKEDLIST OF SIZE " << size << std::endl;
while (current != NULL){
p_Out << "LL ELEMENT " << counter++ << " : ";
p_Out << *(current->getData()) << std::endl;
current = current->getNext();
}
}
#endif
错误:
Error 2 error LNK2019: unresolved external symbol "class
std::basic_ostream<char,struct std::char_traits<char> > & __cdecl
operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class
LinkedList<class CMSContent> const &)" (??6@YAAAV?$basic_ostream@DU
$char_traits@D@std@@@std@@AAV01@ABV?$LinkedList@VCMSContent@@@@@Z) referenced in function "public: void __thiscall CMS::print(void)" (?print@CMS@@QAEXXZ) C:\Users\knudde\Documents\Visual Studio 2012\Projects\Ex1314\Ex1314\CMS.obj Ex1314
也许 CMSContent 有问题?
内容.h:
#ifndef H_CONTENT
#define H_CONTENT
#include <map>
#include <set>
#include <iostream>
#include <string>
enum ACCESSRIGHT { owner, modify, read, none };
class CMSContent {
public:
CMSContent(std::string p_Id, std::string p_Username);
void addPermissionUser(ACCESSRIGHT p_Right, std::string p_Username);
ACCESSRIGHT getAccessright(std::string p_Username);
std::string getIdentifier(){ return identifier; };
virtual std::string serialise() const=0;
bool CMSContent::operator< (const CMSContent& param) const;
bool CMSContent::operator<= (const CMSContent& param) const;
bool CMSContent::operator== (const CMSContent& param) const;
friend std::ostream& operator<<(std::ostream& outputStream, CMSContent& secondOperand);
protected:
std::string identifier;
std::map<ACCESSRIGHT, std::set<std::string> > accessrightsByRank;
//map with key accessright and value set of usernames with given access right
private:
void setIdentifier(std::string p_Id){ identifier = p_Id; };
bool userHasHigherAccessRight(ACCESSRIGHT p_Right, std::string p_Username);
void removeLowerAccessRights(ACCESSRIGHT p_Right, std::string p_Username);
static int uniqueID;
};
class Project : public CMSContent {
public:
Project(std::string p_Name, std::string p_Description, std::string p_Username);
virtual std::string serialise() const;
std::string getProjectdescription(){ return projectdescription; };
void setProjectdescription(std::string p_Description){ projectdescription = p_Description; };
protected:
std::string projectdescription;
};
class Document : public CMSContent {
public:
Document(std::string p_Name, std::string p_Username, std::string p_URL);
virtual std::string serialise() const;
std::string getURL(){ return URL; };
void setURL(std::string p_Url){ URL = p_Url; };
protected:
std::string URL;
};
class HowTo : public CMSContent {
public:
HowTo(std::string p_Subject, std::string p_Howto_content, std::string p_Username);
virtual std::string serialise() const;
std::string getHowto_content() { return howto_content; }
void setHowto_content(std::string p_Howto_content) { howto_content = p_Howto_content; }
protected:
std::string howto_content;
};
#endif
内容.cpp:
#include "Content.h"
#include <sstream>
CMSContent::CMSContent(std::string p_Id, std::string p_Username) : identifier(p_Id){
accessrightsByRank[owner].insert(p_Username);
}
void CMSContent::addPermissionUser(ACCESSRIGHT right, std::string p_Username) {
if (!userHasHigherAccessRight(right, p_Username)){
removeLowerAccessRights(right, p_Username);
accessrightsByRank[right].insert(p_Username);
}
}
bool CMSContent::operator< (const CMSContent& param) const{
return (this->identifier.compare(param.identifier)<0);
}
bool CMSContent::operator<= (const CMSContent& param) const{
return (this->identifier.compare(param.identifier)<=0);
}
bool CMSContent::operator== (const CMSContent& param) const{
return (this->identifier.compare(param.identifier)==0);
}
std::ostream& operator<<(std::ostream& outputStream, CMSContent& cont){
outputStream<<cont.serialise();
outputStream<<"owner = ";
std::set<std::string>::iterator a,b;
a=cont.accessrightsByRank[owner].begin();
b=cont.accessrightsByRank[owner].end();
while(a!=b){
outputStream << (*a) <<std::endl;
}
outputStream<<"modify = ";
a=cont.accessrightsByRank[modify].begin();
b=cont.accessrightsByRank[modify].end();
while(a!=b){
outputStream << (*a) <<std::endl;
}
outputStream<<"read = ";
a=cont.accessrightsByRank[read].begin();
b=cont.accessrightsByRank[read].end();
while(a!=b){
outputStream << (*a) <<std::endl;
}
return outputStream;
}
bool CMSContent::userHasHigherAccessRight(ACCESSRIGHT right, std::string p_Username){
//TODO
if(right==owner){return false;}
std::map<ACCESSRIGHT, std::set<std::string> >::iterator beg, end;
std::set<std::string> ::iterator beg1, end1;
beg=accessrightsByRank.begin();
end=accessrightsByRank.find(right);
while(beg != end){
beg1=(*beg).second.begin();
end1=(*beg).second.end();
while(beg1!=end1){
if((*beg1).compare(p_Username)==0){
return true;
}
beg1++;
}
beg++;
}
return false;
}
void CMSContent::removeLowerAccessRights(ACCESSRIGHT right, std::string p_Username){
//TODO
std::map<ACCESSRIGHT, std::set<std::string> >::iterator beg, end;
std::set<std::string> ::iterator beg1, end1;
end=accessrightsByRank.end();
beg=accessrightsByRank.find(right)++;
while(beg != end){
beg1=(*beg).second.begin();
end1=(*beg).second.end();
while(beg1!=end1){
if((*beg1).compare(p_Username)==0){
(*beg).second.erase(beg1);
return;
}
beg1++;
}
beg++;
}
}
Project::Project(std::string p_Identifier, std::string p_Description, std::string p_Username) : CMSContent("P;"+p_Identifier, p_Username){
projectdescription = p_Description;
}
std::string Project::serialise() const {
std::stringstream output;
output << "Project name = " << identifier << std::endl;
output << "Project description = " << projectdescription << std::endl;
return output.str();
}
Document::Document(std::string p_Identifier, std::string p_Username, std::string p_URL) : CMSContent("D;"+p_Identifier, p_Username){
URL = p_URL;
}
std::string Document::serialise() const {
std::stringstream output;
output << "Document name = " << identifier << std::endl;
output << "Document URL = " << URL << std::endl;
return output.str();
}
HowTo::HowTo(std::string p_Identifier, std::string p_Howto_content, std::string p_Username) : CMSContent("H;"+p_Identifier, p_Username){
howto_content = p_Howto_content;
}
std::string HowTo::serialise() const{
std::stringstream output;
output << "Howto subject = " << identifier << std::endl;
output << "Howto content = " << howto_content << std::endl;
return output.str();
}
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!