I am still learning C++, so reading all similar posts (on SO) about this problem did not give me clarity.
I want to create a method called getFixedLeg
inside an object SwapFixedIborDefinition
that will return AnnuityCouponFixedDefinition
object.
While trying to solve the problem I found that in the Debug folder of the Project these objects where created:
main.obj
SwapFixedIborDefinition.obj
GeneratorSwapFixedIbor.obj
If I comment out the method and all the mentioning of the AnnuityCouponFixedDefinition
class then everything works fine.
I have 2 questions:
- How to locate and resolve the error I have?
- Why do I have different errors when I launch my project (I work in VS2017) in Debug and Release modes?
In case of Debug I get:
Error LNK2019 unresolved external symbol "public: __thiscall AnnuityCouponFixedDefinition::AnnuityCouponFixedDefinition(double,class GeneratorSwapFixedIbor,double)" (??0AnnuityCouponFixedDefinition@@QAE@NVGeneratorSwapFixedIbor@@N@Z) referenced in function "public: class AnnuityCouponFixedDefinition __thiscall SwapFixedIborDefinition::getFixedLeg(double,class GeneratorSwapFixedIbor,double)" (?getFixedLeg@SwapFixedIborDefinition@@QAE?AVAnnuityCouponFixedDefinition@@NVGeneratorSwapFixedIbor@@N@Z) ProjectGenchoCurveConstruction C:\Users\yanto\source\repos\ProjectGenchoCurveConstruction\ProjectGenchoCurveConstruction\SwapFixedIborDefinition.obj 1
and
Error LNK1120 1 unresolved externals ProjectGenchoCurveConstruction C:\QuantLib-1.11\Debug\ProjectGenchoCurveConstruction.exe 1
while for Release mode I get:
Error LNK1104 cannot open file 'deffile' ProjectGenchoCurveConstruction C:\Users\yanto\source\repos\ProjectGenchoCurveConstruction\ProjectGenchoCurveConstruction\LINK 1
all my code is 3 classes and main file, i.e. 7 files:
main.cpp
#include <iostream>
#include <memory>
#include "GeneratorSwapFixedIbor.h"
#include "SwapFixedIborDefinition.h"
// #include "AnnuityCouponFixedDefinition.h"
int main()
{
GeneratorSwapFixedIbor generator;
double etc = 0;
double mktQuote = 0;
//SwapFixedIborDefinition mySwap(mktQuote, generator, etc);
std::cout << " finish";
return 0;
}
GeneratorSwapFixedIbor.h
#pragma once
class GeneratorSwapFixedIbor
{
double somePrimitive;
double startDate;
double endDate;
double notional;
double rate;
int zero;
public:
GeneratorSwapFixedIbor();
~GeneratorSwapFixedIbor();
double getSomePrimitive();
};
GeneratorSwapFixedIbor.cpp
#include "GeneratorSwapFixedIbor.h"
#include <iostream>
GeneratorSwapFixedIbor::GeneratorSwapFixedIbor()
//: somePrimitive{ somePrimitive }
{
somePrimitive = 101;
std::cout << "Object GeneratorSwapFixedIbor is being created" << somePrimitive;
}
GeneratorSwapFixedIbor::~GeneratorSwapFixedIbor(){}
double GeneratorSwapFixedIbor::getSomePrimitive()
{
return somePrimitive;
}
AnnuityCouponFixedDefinition.h
#pragma once
#include "GeneratorSwapFixedIbor.h"
#include "AnnuityCouponFixedDefinition.h"
class AnnuityCouponFixedDefinition
{
//private:
GeneratorSwapFixedIbor generator;
double mktQuote;
double etc;
public:
AnnuityCouponFixedDefinition();
AnnuityCouponFixedDefinition(double mktQuote, GeneratorSwapFixedIbor generator, double etc);
~AnnuityCouponFixedDefinition();
};
AnnuityCouponFixedDefinition.cpp
#include <iostream>
#include "SwapFixedIborDefinition.h"
#include "GeneratorSwapFixedIbor.h"
#include "AnnuityCouponFixedDefinition.h"
AnnuityCouponFixedDefinition::AnnuityCouponFixedDefinition()
{
std::cout << "Object AnnuityCouponFixedDefinition is being created";
}
AnnuityCouponFixedDefinition::AnnuityCouponFixedDefinition(double mktQuote, GeneratorSwapFixedIbor generator, double etc)
{
std::cout << "Object AnnuityCouponFixedDefinition is being created";
}
AnnuityCouponFixedDefinition::~AnnuityCouponFixedDefinition(){}
SwapFixedIborDefinition.h
#pragma once
#include "GeneratorSwapFixedIbor.h"
#include "AnnuityCouponFixedDefinition.h"
class SwapFixedIborDefinition
{
//private:
GeneratorSwapFixedIbor generator;
double mktQuote;
double etc;
public:
SwapFixedIborDefinition();
SwapFixedIborDefinition(double mktQuote, GeneratorSwapFixedIbor generator, double etc);
AnnuityCouponFixedDefinition getFixedLeg(double mktQuote, GeneratorSwapFixedIbor generator, double etc);
~SwapFixedIborDefinition();
double get_smth();
};
SwapFixedIborDefinition.cpp
#include <iostream>
#include "SwapFixedIborDefinition.h"
#include "GeneratorSwapFixedIbor.h"
#include "AnnuityCouponFixedDefinition.h"
SwapFixedIborDefinition::SwapFixedIborDefinition() {}
SwapFixedIborDefinition::SwapFixedIborDefinition(double mktQuote, GeneratorSwapFixedIbor generator, double etc)
: mktQuote{ mktQuote }, generator{ generator }, etc{ etc }
{
std::cout << "Object SwapFixedIbor is being created";
}
AnnuityCouponFixedDefinition SwapFixedIborDefinition::getFixedLeg(double mktQuote, GeneratorSwapFixedIbor generator, double etc)
{
return AnnuityCouponFixedDefinition(mktQuote, generator, etc);
}
double SwapFixedIborDefinition::get_smth() {
std::cout << " we can call smth ";
return 100;
}
SwapFixedIborDefinition::~SwapFixedIborDefinition(){}
This is how my solution explorer looks like.